我如何在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设置模型名称?
你可以简单地把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]未定义,将会引发错误。