我如何在AngularJS中设置dynamic模型名称?

我想用一些dynamic的问题填充一个表单( 在这里提琴):

<div ng-app ng-controller="QuestionController"> <ul ng-repeat="question in Questions"> <li> <div>{{question.Text}}</div> <select ng-model="Answers['{{question.Name}}']" ng-options="option for option in question.Options"> </select> </li> </ul> <a ng-click="ShowAnswers()">Submit</a> </div> ​ function QuestionController($scope) { $scope.Answers = {}; $scope.Questions = [ { "Text": "Gender?", "Name": "GenderQuestion", "Options": ["Male", "Female"]}, { "Text": "Favorite color?", "Name": "ColorQuestion", "Options": ["Red", "Blue", "Green"]} ]; $scope.ShowAnswers = function() { alert($scope.Answers["GenderQuestion"]); alert($scope.Answers["{{question.Name}}"]); }; }​ 

一切正常,除了模型字面意思解决scheme[“{{question.Name}}”],而不是评估Answers [“GenderQuestion”]。 我如何dynamic设置模型名称?

http://jsfiddle.net/DrQ77/

你可以简单地把JavaScriptexpression式放在ng-model

你可以使用像这个scopeValue[field] ,但如果你的领域是在另一个对象,你将需要另一个解决scheme。

为了解决所有的情况,你可以使用这个指令:

 this.app.directive('dynamicModel', ['$compile', '$parse', function ($compile, $parse) { return { restrict: 'A', terminal: true, priority: 100000, link: function (scope, elem) { var name = $parse(elem.attr('dynamic-model'))(scope); elem.removeAttr('dynamic-model'); elem.attr('ng-model', name); $compile(elem)(scope); } }; }]); 

Html例子:

 <input dynamic-model="'scopeValue.' + field" type="text"> 

我最终做的是这样的:

在控制器中:

 link: function($scope, $element, $attr) { $scope.scope = $scope; // or $scope.$parent, as needed $scope.field = $attr.field = '_suffix'; $scope.subfield = $attr.sub_node; ... 

所以在模板中我可以使用完全dynamic的名称,而不仅仅是在某个硬编码的元素下面(比如在你的“Answers”情况下):

 <textarea ng-model="scope[field][subfield]"></textarea> 

希望这可以帮助。

为了让@abourget提供的答案更加完整,以下代码行中的scopeValue [field]的值可能是未定义的。 这在设置子字段时会导致错误:

 <textarea ng-model="scopeValue[field][subfield]"></textarea> 

解决这个问题的一种方法是添加一个属性ng-focus =“nullSafe(field)”,所以你的代码如下所示:

 <textarea ng-focus="nullSafe(field)" ng-model="scopeValue[field][subfield]"></textarea> 

然后在控制器中定义nullSafe(field),如下所示:

 $scope.nullSafe = function ( field ) { if ( !$scope.scopeValue[field] ) { $scope.scopeValue[field] = {}; } }; 

这将确保在将任何值设置为scopeValue [field] [subfield]之前,scopeValue [field]不是未定义的。

注意:ng-change =“nullSafe(field)”不能使用ng-change =“nullSafe(field)”来实现相同的结果,因为ng-change在ng-model被改变后发生,如果scopeValue [field]未定义,将会引发错误。