Wayne Ellery的回答确实回答了这个问题,因为它显示了“在ng-repeat 中获取和设置输入框的更好方法”。
但是,如果您真的想在问题和评论中暗示ng-model-options="{getterSetter: true}"
的ng-repeat
as 中使用它,那么它会稍微复杂一些,因为在您的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
地图中。
归功于此答案及其在很大程度上基于此答案的评论。