如何在AngularJS中使用$ scope$ watch和$ scope$ apply?

如何解决如何在AngularJS中使用$ scope$ watch和$ scope$ apply?

您需要了解AngularJS的工作原理才能理解它。

消化周期和作用域

首先,AngularJS定义了所谓的 的概念。这个周期可以看作是一个循环,在此期间AngularJS检查所有s 的所有变量是否有任何更改$scope。因此,如果您已$scope.myVar在控制器中定义并且该变量被 ,那么您将隐式告诉AngularJS监视myVar循环的每次迭代中的更改。

一个自然而然的跟进问题是:是否一切都与$scope被监视有关?幸运的是,没有。如果您要监视中的每个对象的更改$scope,那么摘要循环很快就会花费很多时间进行评估,并且您会很快遇到性能问题。这就是AngularJS团队为我们提供了两种方法来声明某些$scope变量被监视的原因(请参阅下文)。

$ watch有助于监听$ scope的变化

有两种将$scope变量声明为被监视的方法。

  1. 通过表达式在模板中使用它 <span>{{myVar}}</span>
  2. 通过$watch服务手动添加

广告1)这是最常见的情况,我敢肯定您以前看过它,但是您不知道这是在后台创建手表的。是的,它有!使用AngularJS指令(例如ng- repeat)也可以创建隐式监视。

广告2)这就是您制作 。$watch附加到的某些值$scope更改后,service服务可以帮助您运行某些代码。它很少使用,但有时会有所帮助。例如,如果您希望每次“ myVar”更改时都运行一些代码,则可以执行以下操作:

function MyController($scope) {

    $scope.myVar = 1;

    $scope.$watch('myVar', function() {
        alert('hey, myVar has changed!');
    });

    $scope.buttonClicked = function() {
        $scope.myVar = 2; // This will trigger $watch expression to kick in
    };
}

$ apply允许将更改与摘要周期集成在一起

您可以将 。您会看到,每次更改直接 对象的某些受 ,AngularJS都会知道更改已发生。这是因为AngularJS已经知道监视这些更改。因此,如果发生在框架管理的代码中,则摘要循环将继续进行。

但是,有时您想 并看到更改能够正常传播。考虑一下-您有一个$scope.myVar将在jQuery$.ajax()处理程序中修改的值。这将在将来的某个时刻发生。AngularJS不能等待这种情况发生,因为尚未指示它等待jQuery。

为了解决这个问题,$apply已经引入。它使您可以显式启动消化周期。但是,您仅应使用此方法将某些数据迁移到AngularJS(与其他框架集成),而决不要将此方法与常规AngularJS代码结合使用,因为AngularJS会抛出错误。

所有这些与DOM有什么关系?

好了,既然您已经知道了所有这些,那么您应该再次真正按照本教程进行操作。$scope只要没有任何变化,摘要周期就可以通过评估附加到all 的每个观察程序来确保UI和JavaScript代码保持同步。如果摘要循环中没有其他更改发生,则视为已完成。

您可以$scope在Controller中显式地将对象附加到对象,也可以{{expression}}直接在视图中以形式声明它们。

我希望这有助于澄清有关这一切的一些基本知识。

进一步阅读:

解决方法

我不知道如何使用$scope.$watch$scope.$apply。官方文档没有帮助。

我不明白的是:

  • 他们连接到DOM吗?
  • 如何更新对模型的DOM更改?
  • 它们之间的连接点是什么?

我尝试了本教程,但这需要对它的理解$watch并且$apply理所当然。

做什么$apply$watch做什么,以及如何正确使用它们?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?