我尝试允许用户使用ngRepeat
和ngModel
编辑项目列表。 (See this fiddle。)但是,我尝试过的两种方法都会导致奇怪的行为:一种不更新模型,另一种模糊每种keydown上的形式。
我在这里做错了吗?这不是支持的用例吗?
以下是小提琴的代码,为方便起见而复制:
<html ng-app>
<head>
<link href="//netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/css/bootstrap-combined.min.css" rel="stylesheet">
</head>
<body ng-init="names = ['Sam', 'Harry', 'Sally']">
<h1>Fun with Fields and ngModel</h1>
<p>names: {{names}}</p>
<h3>Binding to each element directly:</h3>
<div ng-repeat="name in names">
Value: {{name}}
<input ng-model="name">
</div>
<p class="muted">The binding does not appear to be working: the value in the model is not changed.</p>
<h3>Indexing into the array:</h3>
<div ng-repeat="name in names">
Value: {{names[$index]}}
<input ng-model="names[$index]">
</div>
<p class="muted">Type one character, and the input field loses focus. However, the binding appears to be working correctly.</p>
</body>
</html>
答案 0 :(得分:120)
这似乎是一个具有约束力的问题。
你的ngRepeat
正在迭代集合中的字符串,它应该迭代对象。解决问题
<body ng-init="models = [{name:'Sam'},{name:'Harry'},{name:'Sally'}]">
<h1>Fun with Fields and ngModel</h1>
<p>names: {{models}}</p>
<h3>Binding to each element directly:</h3>
<div ng-repeat="model in models">
Value: {{model.name}}
<input ng-model="model.name">
</div>
jsfiddle:http://jsfiddle.net/jaimem/rnw3u/5/
答案 1 :(得分:70)
使用Angular最新版本(1.2.1)并按$index
跟踪。此问题已修复
<div ng-repeat="(i, name) in names track by $index">
Value: {{name}}
<input ng-model="names[i]">
</div>
答案 2 :(得分:43)
当有必要了解scopes,ngRepeat和ngModel与NgModelController的工作方式时,您会陷入困境。也尝试使用1.0.3版本。你的例子会有所不同。
您可以简单地使用jm提供的解决方案 -
但如果你想更深入地处理这种情况,你必须明白:
您的示例“直接绑定到每个元素”如何适用于AngularJS 1.0.3:
'f'
; ngModelController
更改项目范围的模型(名称数组未更改)=&gt; name == 'Samf'
,names == ['Sam', 'Harry', 'Sally']
; $digest
循环已启动; ngRepeat
将来自项目范围('Samf'
)的模型值替换为未更改名称数组中的值('Sam'
); ngModelController
使用实际模型值('Sam'
)重新输入输入。您的示例“索引到数组中”的工作原理如何:
'f'
; ngModelController
更改名称array
=&gt;中的项目`names == ['Samf','Harry','Sally']; ngRepeat
在缓存中找不到'Samf'
; ngRepeat
创建新范围,添加带有新输入的新div元素(这就是输入字段失去焦点的原因 - 旧输入的旧div被新输入替换为新输入); 此外,您可以尝试使用AngularJS Batarang,并查看如何使用您输入的输入更改div范围的$ id。
答案 3 :(得分:6)
如果您不需要使用每个键击更新模型,只需绑定到name
,然后更新模糊事件上的数组项:
<div ng-repeat="name in names">
Value: {{name}}
<input ng-model="name" ng-blur="names[$index] = name" />
</div>
答案 4 :(得分:4)
我刚刚将AngularJs更新为1.1.2并且没有任何问题。我想这个错误是固定的。
http://ci.angularjs.org/job/angular.js-pete/57/artifact/build/angular.js
答案 5 :(得分:2)
问题似乎与ng-model
如何与input
一起使用并覆盖name
对象,导致ng-repeat
丢失。
作为一种解决方法,可以使用以下代码:
<div ng-repeat="name in names">
Value: {{name}}
<input ng-model="names[$index]">
</div>
希望有所帮助
答案 6 :(得分:1)
我尝试了上面的解决方案来解决我的问题。谢谢!
http://jsfiddle.net/leighboone/wn9Ym/7/
以下是我的版本:
var myApp = angular.module('myApp', []);
function MyCtrl($scope) {
$scope.models = [{
name: 'Device1',
checked: true
}, {
name: 'Device1',
checked: true
}, {
name: 'Device1',
checked: true
}];
}
和我的HTML
<div ng-app="myApp">
<div ng-controller="MyCtrl">
<h1>Fun with Fields and ngModel</h1>
<p>names: {{models}}</p>
<table class="table table-striped">
<thead>
<tr>
<th></th>
<th>Feature 1</td>
<th>Feature 2</th>
<th>Feature 3</th>
</tr>
</thead>
<tbody>
<tr>
<td>Device</td>
<td ng-repeat="modelCheck in models" class=""> <span>
{{modelCheck.checked}}
</span>
</td>
</tr>
<tr>
<td>
<label class="control-label">Which devices?</label>
</td>
<td ng-repeat="model in models">{{model.name}}
<input type="checkbox" class="checkbox inline" ng-model="model.checked" />
</td>
</tr>
</tbody>
</table>
</div>
</div>
答案 7 :(得分:-5)
怎么做:
<select ng-model="myModel($index+1)">
在我的检查员元素中:
<select ng-model="myModel1">
...
<select ng-model="myModel2">