动态分配 ng-model

IT技术 javascript angularjs
2021-03-07 19:21:54

我正在尝试从对象数组生成一组复选框。我的目标是让复选框将它们的 ng-model 动态映射到将提交到数组中的新对象的属性。

我想到的是

<li ng-repeat="item in items">
    <label>{{item.name}}</label>
    <input type="checkbox" ng-model="newObject.{{item.name}}">
</li>

正如在这个 JSFiddle 上看到的那样,这不起作用:

http://jsfiddle.net/GreenGeorge/NKjXB/2/

有人可以帮忙吗?

5个回答

这应该会给你想要的结果:

<input type="checkbox" ng-model="newObject[item.name]">

这是一个有效的 plunk:http ://plnkr.co/edit/ALHQtkjiUDzZVtTfLIOR? p= preview

啊是的,我习惯于在 php 中思考并期望实际标记更改为名称,它起作用了。谢谢!
2021-04-27 19:21:54
嗯,奇怪,刚刚添加了一个活生生的例子(plunker 因为某种原因 jsFiddle 今天不在我这边工作)。
2021-05-01 19:21:54
太棒了,正是我要找的。我爱角!
2021-05-01 19:21:54
嗯,实际上这确实给了我“<input ng-model="newObject[item.name]">”,这是我缺少的东西吗?
2021-05-08 19:21:54
它在 Angular 2 中也很有效。但是对于多维对象是否也有解决方案?在你的榜样,如果item.name有时应该指出newObject['x'],有时到newObject['x']['y']
2021-05-10 19:21:54

编辑 正如评论中正确指出的那样,将其与 ng-change 一起使用需要预先存在“虚拟”ng-model。然而,应该注意的是,显然在 1.3 中,框架已经提供了所需的选项。请查看下面的https://stackoverflow.com/a/28365515/3497830/编辑

以防万一你像我一样在一个更复杂的任务上绊倒一个简单的案例,这是我想出的将任意表达式动态绑定到 ng-model 的解决方案:http : //plnkr.co/edit/ccdJTm0zBnqjntEQfAfx?p =预览

方法:我创建了一个指令 dynamicModel,它采用标准的角度表达式,对其进行评估并将结果通过 ng-model 和 $compile 链接到范围。

var app = angular.module('plunker', []);

app.controller('MainCtrl', function($scope) {
  $scope.data = {};
  $scope.testvalue = 'data.foo';
  $scope.eval = $scope.$eval;
});

var app = angular.module('plunker', []);

app.controller('MainCtrl', function($scope) {
  $scope.data = {};
  $scope.testvalue = 'data.foo';
  $scope.eval = $scope.$eval;
});

app.directive('dynamicModel', ['$compile', function ($compile) {
    return {
        'link': function(scope, element, attrs) {
            scope.$watch(attrs.dynamicModel, function(dynamicModel) {
                if (attrs.ngModel == dynamicModel || !dynamicModel) return;

                element.attr('ng-model', dynamicModel);
                if (dynamicModel == '') {
                    element.removeAttr('ng-model');
                }

                // Unbind all previous event handlers, this is 
                // necessary to remove previously linked models.
                element.unbind();
                $compile(element)(scope);
            });
        }
    };
}]);

用法只是 dynamic-model="angularExpression",其中 angularExpression 产生一个字符串,用作 ng-model 的表达式。

我希望这可以避免有人不得不提出这个解决方案的麻烦。

问候,贾斯图斯

ng-change 不适用于此。如果您查看 angular 源,ngChange 指令将 ngModel 作为必需指令。快速搜索显示只有 ngChange 和 ngList 有这个问题。所有其他指令似乎都将 ngModel 作为可选控制器。我通过使用动态模型指令向任何元素添加 ng-model="dummyValue" 来解决这个问题。由于对动态模型调用 $compile 的更改,ngChange 和任何其他使用 ng-model 值的指令都会正确更新。
2021-04-20 19:21:54
这是解决方案的竞争宝石。你让我摆脱了一个非常棘手的问题 - 谢谢!
2021-04-24 19:21:54
你能更具体的布赖恩吗?你尝试了什么,发生了什么?
2021-04-30 19:21:54
你是救命稻草。在找到这篇文章之前,我几乎绝望了。
2021-05-02 19:21:54
这是一个更强大的解决方案,当您不需要观察动态模型值的变化时 - stackoverflow.com/a/32096328/887092
2021-05-14 19:21:54

使用 Angular 1.3,您可以使用ng-model-options指令动态分配模型,或绑定到表达式。

这是一个 plunkr:http ://plnkr.co/edit/65EBiySUc1iWCWG6Ov98?p=preview

<input type="text" ng-model="name"><br>
<input type="text" ng-model="user.name" 
ng-model-options="{ getterSetter: true }">

更多信息在ngModelOptions这里:https : //docs.angularjs.org/api/ng/directive/ngModelOptions

如果我遗漏了什么,请原谅我,但您的 plunk 似乎没有包括动态模型分配。ngModelOptions 显然不支持这一点。你能不能澄清一下?因为如果它确实以这种方式工作,那将非常有用......
2021-04-26 19:21:54
感谢 Rob 引起我的注意,我已经更新了我的答案并链接到了你的答案。
2021-05-15 19:21:54
@XMLilley“getterSetter:决定是否将绑定到 ngModel 的函数视为 getter/setter 的布尔值。”
2021-05-18 19:21:54

这是我支持更深层表达的方法,例如“model.level1.level2.value”

<input class="form-control" ng-model="Utility.safePath(model, item.modelPath).value">

其中 item.modelPath = 'level1.level2' 和 Utility(model, 'level1.level2') 是返回 model.level1.level2 的效用函数

Utility.safePath 返回由路径字符串指定的嵌套变量的值。例如,level1.level2 指的是model.level1.level2。
2021-04-29 19:21:54
你能详细说明这是如何工作的吗?Utility.safePath 返回什么以便您可以使用 .value?
2021-05-15 19:21:54

<!DOCTYPE html>
<html>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.4/angular.min.js"></script>
<body>

    <div ng-app="myApp" ng-controller="myCtrl">
        <form name="priceForm" ng-submit="submitPriceForm()">
            <div ng-repeat="x in [].constructor(9) track by $index">
                <label>
                    Person {{$index+1}} <span class="warning-text">*</span>
                </label>
                <input type="number" class="form-control" name="person{{$index+1}}" ng-model="price['person'+($index+1)]" />

            </div>
            <button>Save</button>
        </form>
    </div>

    <script>
        var app = angular.module('myApp', []);
        app.controller('myCtrl', function ($scope) {
            $scope.price = [];
            $scope.submitPriceForm = function () {
                //objects be like $scope.price=[{person1:value},{person2:value}....]
                console.log($scope.price);
            }
        });
    </script>
</body>
</html>