AngularJS如何区分以下行为?

时间:2014-12-09 15:29:40

标签: javascript angularjs

假设this.model === $scope.model

以下内容将触发摘要:

$scope.model.property1.property2 = true; 

但这不会没有手表:

this.model.property1.property2 = true;  

AngularJS如何区分这两行代码?

1 个答案:

答案 0 :(得分:1)

我会尽力回答这个问题。没有任何东西可以导致这些行中的任何一个消化:

$scope.model.property1.property2 = true;
this.model.property1.property2 = true;

这两个都是简单的任务。摘要由显式调用它的代码触发。这通常通过$ scope。$ eval(),$ scope。$ apply()和显式$ scope。$ digest()调用来实现。例如,ng-click绑定到元素click事件,并使用附加到该指令的函数调用$ scope。$ apply()。

$ digest循环首先执行表达式以在作用域的asyncQueue上进行求值(例如,由$ scope。$ evalAsync()填充)。接下来,它遍历范围并评估需要触发的监视,并调用分配给它们的相应函数(如果发现更改)。

所以有几点要记得与你的问题有关:

  • 上述两行都不会触发$ digest
  • Angular不需要区分两行代码,因为它们都是对同一属性的简单赋值(假设this.model === $ scope.model,如问题中所述)。即使this.model和$ scope.model不同,它仍然只是简单的赋值,但是到不同的目的地。
  • 在遍历范围时观察$ digest循环中的“fire”。

jsfiddle从高层次上证明了这一点。请注意,$ scope.model.property1.property2或this.model.property1.property2上没有明确的监视。视图已更新,因为两个分配都在单独的ng-clicks中发生,这会触发$ digest循环。视图中的{{model.property1.property2}}会设置一个关于此值的监视,当$ digest发生时,会通过每次ng-click更新。

如果没有看到发生实际差异的代码示例,我不能说为什么一个行为与另一个行为不同。

相关问题