我想问你是否可以帮我解决这个问题。
我已经用我的问题here创建了一个jsfiddle。我需要使用ng-model =“my _ {{$ index}}”的方式在ng-repeater中使用ng-model动态生成一些输入。
在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;
});
}
你能给我任何想法吗?
非常感谢。
答案 0 :(得分:45)
它能解决你的问题吗?
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>
答案 1 :(得分:22)
你可以做的是在作用域上创建一个对象(比如values
)并绑定到这个对象的属性,如下所示:
<input type="text" ng-model="values['field_' + $index]" />
这是一个jsFiddle,说明了完整的解决方案:http://jsfiddle.net/KjsWL/
答案 2 :(得分:3)
我确实从pkozlowski's中解释了我的答案并尝试使用动态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;
这很简单,我希望我的回答有所帮助。
答案 3 :(得分:1)
是否有理由生成这些字段名称?您可以将每个字段视为具有名称和值而不是字符串名称的对象吗? (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>
答案 4 :(得分:0)
Beterraba的回答对我很有帮助。但是,当我不得不将解决方案迁移到Typescript时,它不适合我。这是我做的事情。我将各个参数(在您的示例中的queryList上的字段)扩展为包含“value”字段的完整对象。然后我绑定到“价值”字段,它工作得很好!
原来你有:
[
{ name: 'Check Users', fields: [ "Name", "Id"] },
...
}
]
我把它改成了这样的东西:
[
{ name: 'Check Users', fields: [
{Text:"Name",Value:""},
{Text:"Id",Value:0}],
...
]
}
]
...并绑定到'Value'子字段。
如果你愿意的话,这是我的打字稿。
在html中:
<div ng-repeat="param in ctrl.sprocparams" >
<sproc-param param="param" />
</div>
在使用Angular Material的sproc-param指令中。查看我将ng-model绑定到param.Value的位置:
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: "="
}
}
答案 5 :(得分:0)
我需要使用
ng-model="my_{{$index}}"
方式在ng-repeater中动态生成一些带有ng-model的输入。
可以将this
标识符与方括号符号property accessor一起使用:
<tr ng-repeat="param in parameters">
<td>{{param}}:</td>
<td>
<input type="text" ng-model="this['my_'+$index]" />
my_{{$index}}
</td>
</tr>
可以使用标识符this
访问$ scope对象。
有关更多信息,请参见