Wayne Ellery的答案确实回答了这个问题,因为它展示了“在ng-repeat中获取和设置输入框的更好方法”。
然而,如果你真的想在ng-repeat
中使用ng-model-options="{getterSetter: true}"
,就像问题和评论中所暗示的那样,那么情况会更加复杂,因为在你的getterSetter
函数中,你不知道是哪个ng-repeat
项被引用了。
基本上,你需要为每个项目传递一个不同的getter/setter函数,你可以通过向ng-model
传递一个函数来为你创建特定于行的getter/setter函数。
<div ng-app="app" ng-controller="ctrl">
<div ng-repeat='row in items'>
<span>{{row.name}}</span>
<input type='text' ng-model='createTitleGetterSetter(row.name)'
ng-model-options='{ getterSetter: true }' />
</div>
<hr/>
<pre>{{ itemTitles | json }}</pre>
</div>
而且JS代码:
var app = angular.module('app',[]);
app.controller('ctrl', function($scope) {
$scope.items = [
{'name': 'a'},
{'name': 'b'},
{'name': 'c'}
];
$scope.itemTitles = {};
$scope.createTitleGetterSetter = function(name) {
if (!$scope.itemTitles[name]) {
$scope.itemTitles[name] = {
getterSetter: function(newValue) {
return arguments.length === 0 ?
$scope.itemTitles[name].title :
$scope.itemTitles[name].title = newValue;
},
title: ''
}
}
return $scope.itemTitles[name].getterSetter;
};
});
JSFiddle在这里: http://jsfiddle.net/zLg3mLd0/1/
在这种情况下,项目标题当然不会与项目对象一起存储(如果您想要这样做,只需使用简单的ng-model
即可),而是存储在itemTitles
映射中。
感谢this answer及其评论,本答案在很大程度上基于它们。