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

One-time binding along with directive's bidirectional binding and ng-repeat

假设我们有以下指令:

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 来说明这两种情况。

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

我相信您的问题的答案是肯定的,这是正确的行为。当 items 中的 item 发生变化时,将创建模板的新实例,同时简单地删除旧模板。在您的例子中,创建了一个新的 foo 元素,因此 prop 属性值也是新的。这是来自 Angular ngRepeat 文档:

When the contents of the collection change, ngRepeat makes the corresponding changes to the DOM:

  • When an item is added, a new instance of the template is added to the DOM.
  • When an item is removed, its template instance is removed from the DOM.
  • When items are reordered, their respective templates are reordered in the DOM.

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