Я хочу заполнить форму некоторыми динамическими вопросами (скрипт здесь ):
<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}}"]);
};
}
Все работает, кроме модели буквально Answers ["{{question.Name}}"], а не оцениваемых Answers ["GenderQuestion"]. Как я могу установить это имя модели динамически?
ng-pattern="field.pattern"
то, что мне действительно нужноpattern="{{field.pattern}}"
. Непонятно, что angular обычно предоставляет помощника для динамических атрибутов, но на этот раз написал собственную проверку на стороне клиента и дал ей то же имя.Вы можете использовать что-то подобное
scopeValue[field]
, но если ваше поле находится в другом объекте, вам понадобится другое решение.Для решения любых ситуаций вы можете использовать эту директиву:
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">
источник
ng-model="{{ variable }}"
:)В итоге я сделал что-то вроде этого:
В контроллере:
link: function($scope, $element, $attr) { $scope.scope = $scope; // or $scope.$parent, as needed $scope.field = $attr.field = '_suffix'; $scope.subfield = $attr.sub_node; ...
поэтому в шаблонах я мог использовать полностью динамические имена, а не только под определенным жестко запрограммированным элементом (как в вашем случае «Ответы»):
<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 (поле) в контроллере, как показано ниже:
$scope.nullSafe = function ( field ) { if ( !$scope.scopeValue[field] ) { $scope.scopeValue[field] = {}; } };
Это гарантирует, что scopeValue [field] не является неопределенным перед установкой любого значения для scopeValue [field] [subfield].
Примечание. Вы не можете использовать ng-change = "nullSafe (field)" для достижения того же результата, потому что ng-change происходит после изменения ng-модели, что приведет к ошибке, если scopeValue [field] не определено.
источник
Или вы можете использовать
<select [(ngModel)]="Answers[''+question.Name+'']" ng-options="option for option in question.Options"> </select>
источник