Как генерировать динамически ng-model = "my _ {{$ index}}" с ng-repeat в AngularJS?
Я хотел бы спросить вас, можете ли вы дать мне руку на это.
Я создал jsfiddle с моей проблемой здесь. Мне нужно динамически генерировать некоторые входы с ng-моделью в ng-повторителе, используя ng-model = "my _ {{$ index}}".
В jsfiddle вы можете видеть, что все работает нормально, пока я не попытаюсь сгенерировать его динамически.
Html:
<div ng-app>
<div ng-controller="MainCtrl">
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tr>
<td>
<select ng-model="selectedQuery"
ng-options="q.name for q in queryList" >
<option title="---Select Query---" value="">---Select Query---</option>
</select>
</td>
</tr>
<tr ng-repeat="param in parameters">
<td>{{param}}:</td>
<td><input type="text" ng-model="field_X" />field_{{$index}}</td>
</tr>
</table>
<div>
<div>
И javascript...
function MainCtrl($scope) {
$scope.queryList = [
{ name: 'Check Users', fields: [ "Name", "Id"] },
{ name: 'Audit Report', fields: [] },
{ name: 'Bounce Back Report', fields: [ "Date"] }
];
$scope.$watch('selectedQuery', function (newVal, oldVal) {
$scope.parameters = $scope.selectedQuery.fields;
});
}
Можете ли вы дать мне какие-либо идеи?
Большое спасибо.
Ответы
Ответ 1
Решает ли ваша проблема?
function MainCtrl($scope) {
$scope.queryList = [
{ name: 'Check Users', fields: [ "Name", "Id"] },
{ name: 'Audit Report', fields: [] },
{ name: 'Bounce Back Report', fields: [ "Date"] }
];
$scope.models = {};
$scope.$watch('selectedQuery', function (newVal, oldVal) {
if ($scope.selectedQuery) {
$scope.parameters = $scope.selectedQuery.fields;
}
});
}
И в вашем контроллере:
<tr ng-repeat="param in parameters">
<td>{{param}}:</td>
<td><input type="text" ng-model="models[param] " />field_{{$index}}</td>
</tr>
скрипка
Ответ 2
Что вы можете сделать, так это создать объект в области (скажем, values
) и привязать к свойствам этого объекта так:
<input type="text" ng-model="values['field_' + $index]" />
Вот jsFiddle, иллюстрирующий полное решение: http://jsfiddle.net/KjsWL/
Ответ 3
Я разработал свой ответ от pkozlowski и попытаюсь создать динамическую форму с динамической ng-моделью:
<form ng-submit="testDynamic(human)">
<input type="text" ng-model="human.adult[($index+1)].name">
<input type="text" ng-model="human.adult[($index+1)].sex">
<input type="text" ng-model="human.adult[($index+1)].age">
</form>
Но сначала нам нужно определить "человеческую" область внутри нашего контроллера
$scope.human= {};
И затем, по представлению, у нас будут такие данные (в зависимости от того, сколько полей создано):
var name = human.adult[i].name;
var sex = human.adult[i].sex;
var age = human.adult[i].age;
Это довольно просто, и я надеюсь, что мой ответ поможет.
Ответ 4
Есть ли причина генерировать эти имена полей? Можете ли вы обрабатывать каждое поле как объект с именем и значением вместо имени строки? (FIDDLE)
function MainCtrl($scope) {
$scope.queryList = [
{ name: 'Check Users', fields: [ { name: "Name" }, { name: "Id" } ] },
{ name: 'Audit Report', fields: [] },
{ name: 'Bounce Back Report', fields: [ { name: "Date" } ] }
];
}
И просто повторяйте selectedQuery.fields
:
<tr ng-repeat="field in selectedQuery.fields">
<td>{{field.name}}:</td>
<td><input type="text" ng-model="field.value" /></td>
</tr>
Ответ 5
Ответ Beterraba был очень полезен для меня. Однако, когда мне пришлось перенести решение на Typcript, это не повлияло бы на меня. Вот что я сделал вместо этого. Я развернул отдельные параметры (поля в списке запросов в вашем примере) в полные объекты, которые включали поле "значение". Затем я привязался к полю "значение", и он отлично работает!
Первоначально у вас было:
[
{ name: 'Check Users', fields: [ "Name", "Id"] },
...
}
]
Я изменил его на следующее:
[
{ name: 'Check Users', fields: [
{Text:"Name",Value:""},
{Text:"Id",Value:0}],
...
]
}
]
... и привязаны к подполе "Значение".
Вот вам, пожалуйста, мой Титульный лист.
В html:
<div ng-repeat="param in ctrl.sprocparams" >
<sproc-param param="param" />
</div>
В директиве sproc-param, использующей угловой материал. Смотрите, где я привязываю ng-модель к параметру. Значение:
return {
restrict: 'E',
template: '
<md-input-container class="md-block" flex-gt-sm>
<label>{{param.Name}}</label>
<input name="{{param.Name}}" ng-model=param.Value></input>
</md-input-container>',
scope: {
param: "="
}
}
Ответ 6
Мне нужно динамически генерировать некоторые входные данные с помощью ng-модели в ng-репитере, используя способ ng-model="my_{{$index}}"
.
Можно использовать this
идентификатор с аксессором свойства обозначения в скобках:
<tr ng-repeat="param in parameters">
<td>{{param}}:</td>
<td>
<input type="text" ng-model="this['my_'+$index]" />
my_{{$index}}
</td>
</tr>
Можно получить доступ к объекту $ scope, используя идентификатор this
.
Для получения дополнительной информации см.