Ben*_*ick 7 javascript angularjs angularjs-ng-repeat
我正在使用ng-repeat在HTML中创建一个表单,以从作用域中的对象生成表单元素.我还使用该对象生成ng-repeat之外的其他元素.
HTML中的简化示例如下所示:
<div ng-app="App">
<div ng-controller="Ctrl">
<div class="block1">
<form ng-repeat="(key, value) in test">
<label>{{key}}</label>
<input ng-model="value" />
<p>{{value}}</p>
</form>
</div>
<div class="block2">
<p>
{{test.a}}
</p>
<p>
{{test.b}}
</p>
</div>
</div>
</div>
Run Code Online (Sandbox Code Playgroud)
这在JS中:
angular.module('App', []);
function Ctrl($scope) {
$scope.test = {
a:"abc",
b:"def"
}
}
Run Code Online (Sandbox Code Playgroud)
在这个例子中,在块2中的文本设置为初始值test.a和test.b.<p>循环内的输入值和值也设置为初始值.
当我修改输入中的<p>值时,ng-repeat块内的值会正确更新,但<p>block2中的标记无法更新.
为什么这是行为?ng-repeat是否创建了自己的隔离范围?如果是这样,我如何才能让控制器级别范围更新?此外,有人可以解释这种行为背后的想法及其提供的任何好处吗?
cha*_*tfl 23
ng-repeat为每个重复的项创建子范围.因此,您尝试将原语传递给子范围,而不会创建对父级的引用.但是,传递对象时,会传递原始对象引用.
从Angular的一位父亲口中说:
在ng-model中总是有一个点
这是 Angular创作者(2012/12/11)提供的关于Angular Best Practices的精彩视频.转到第31分钟,详细了解这一情况
将数据修改为对象数组:
$scope.test = [{ val:"abc",key:'a'}, {val:"def",key:'b'} ]
Run Code Online (Sandbox Code Playgroud)
然后在转发器中:
<form ng-repeat="item in test">
<label>{{item.key}}</label>
<input ng-model="item.val" />
<p>{{item.val}}</p>
</form>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
19974 次 |
| 最近记录: |