假设我们有以下指令:
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来说明这两种情况。
我的问题是:这种行为是否正确?我希望它在两种情况下都是一致的。
答案 0 :(得分:2)
我相信你的问题的答案是肯定的,这是正确的行为。当item
内的items
发生更改时,会创建一个新的模板实例,而只删除旧版本。在您的情况下,会创建一个新的foo
元素,因此prop
属性值也是新的。这来自Angular ngRepeat文档:
当集合的内容发生变化时,ngRepeat会对DOM进行相应的更改:
- 添加项目时,会将新模板实例添加到DOM中。
- 删除项目后,将从DOM中删除其模板实例。
- 重新排序项目时,各自的模板将在DOM中重新排序。
它没有明确说明更新时会发生什么。但是,我相信新的替代旧的而不是更新。