一次性绑定以及指令的双向绑定和ng-repeat

时间:2015-04-10 17:56:18

标签: javascript angularjs angular-directive

假设我们有以下指令:

app.directive('foo', function() {
  return {
    restrict: 'E',
    scope: { prop: '=' },
    template: '<h1>{{prop}}</h1>'
  };
});

Angular documentation表示可以使用一次性绑定和双向绑定,如下所示:

<foo prop="::someProperty"></foo>

它有效;如果someProperty稍后更改,则foo指令将不知道它。

现在考虑一下这个标记:

<foo ng-repeat="item in items" prop="::item"></foo>

在这种情况下,如果item稍后更改,则会通知foo,就好像存在常规绑定一样。 ::似乎没有任何实际效果(它确实阻止了额外的手表被创建,我检查了自己)。我创建了this plunker来说明这两种情况。

我的问题是:这种行为是否正确?我希望它在两种情况下都是一致的。

1 个答案:

答案 0 :(得分:2)

我相信你的问题的答案是肯定的,这是正确的行为。当item内的items发生更改时,会创建一个新的模板实例,而只删除旧版本。在您的情况下,会创建一个新的foo元素,因此prop属性值也是新的。这来自Angular ngRepeat文档:

  

当集合的内容发生变化时,ngRepeat会对DOM进行相应的更改:

     
      
  • 添加项目时,会将新模板实例添加到DOM中。
  •   
  • 删除项目后,将从DOM中删除其模板实例。
  •   
  • 重新排序项目时,各自的模板将在DOM中重新排序。
  •   

它没有明确说明更新时会发生什么。但是,我相信新的替代旧的而不是更新。