5

我找到了一些关于如何获取 an ng-modelinside的值的好答案ng-repeat,但到目前为止,我还没有找到任何涵盖 setter 的答案。假设我有这样的事情:

<div ng-repeat="item in getItems()">
    <input ng-model="itemTitle" ng-model-options={getterSetter:true}">
</div>

如果我有一个输入框,我会使用这样的东西

...
var _val = '';
$scope.itemTitle = function(val){
    return angular.isDefined(val) ? (_val = val) : _val;
}
...

但是,这会改变每个输入框的值。是否可以定义变量和设置器,可能使用数组?还是有更好的方法来获取和设置 ng-repeat 中的输入框?

4

2 回答 2

5

Wayne Ellery回答确实回答了这个问题,因为它显示了“在ng-repeat 中获取和设置输入框的更好方法”。

但是,如果您真的想在问题和评论中暗示ng-model-options="{getterSetter: true}"ng-repeatas 中使用它,那么它会稍微复杂一些,因为在您的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地图中。

归功于此答案及其在很大程度上基于此答案的评论。

于 2016-03-11T15:39:50.830 回答
2

您将设置ng-model为,item.title因此从返回的数组中的每个对象getItems()都将包含一个title.

<div ng-repeat="item in getItems()">
    <input type="text" ng-model="item.title"/>
</div>
于 2015-01-18T00:33:55.563 回答