2012-09-08 43 views
15

在AngularJS作用域中,在每个事件处理函数(keydown /输入指令的输入事件,选择指令的更改事件等)和其他一些情况下调用$ apply()。

请参阅small example。似乎ngRepeat重新计算并重新绘制每个keydown,尽管其他范围发生变化。

知道这样的决定的基本原理很有意思。

回答

17

对于AngularJS的作者来说这很好,但我相信需要在$ rootScope上调用$ digest(),因为在重复器中触发的更改可能会在其他作用域中产生副作用(即使是$ rootScope) 。

事情是在子范围触发的方法会影响父范围中的对象(因为子范围从父范围继承)。因此,即使在子作用域中定义的函数不能从父作用域修改对象引用,它们仍然可以修改在父作用域中定义的对象中的值。

以上听起来有点神秘让我们考虑一个(有点做作)例如与项目列表:

$scope.items = [{name: 'foo', value:0}, {name: 'bar', value:0}, {name: 'baz', value:0}]; 

现在,让我们用NG-重复显示上面的列表,让我们说,点击一个项目应增加值其他项目(再一次,该示例有点人为,但重点在于在一个范围内触发的操作可能会在其他范围中产生副作用)。这可能是这样的:

$scope.incOther = function(item) { 
     for (var i=0; i<$scope.items.length; i++){ 
      if ($scope.items[i] !== item){ 
       $scope.items[i].value++; 
      } 
     } 
    }; 

的例子函数将修改其他范围和AngularJS价值观 - 以显示正确的结果 - 需要评估父范围观察家(高达$ rootScope,因为我们不知道在哪里一个对象被定义)。

下面是完整的jsfiddle说明这一点:http://jsfiddle.net/pkozlowski_opensource/Z6e5g/3/

其实上面的jsfiddle还包括在$ rootScope对象以表明观察家评价确实需要在最高层开始。

+0

谢谢。你是最对的。我忘记了我可以在父范围中更改对象的值,因为我可以使用$ parent.obj,$ parent。$ parent.obj等来更改整个对象。 –

相关问题