使用angular.js,我有一个动态的表单字段列表,我希望显示给用户进行编辑(以及稍后提交):
var app = angular.module('app', []);
app.controller('Ctrl', function($scope) {
$scope.fields = {
foo: "foo",
bar: "bar",
baz: "baz"
};
});
HTML:
<div ng-app="app" ng-controller="Ctrl">
<table>
<th>key</th>
<th>value</th>
<th>fields[key]</th>
<tr ng-repeat="(key,value) in fields">
<td>{{key}}:</td>
<td><input type="text" ng-model="value"/></td>
<td><input type="text" ng-model="fields[key]"/></td>
</tr>
</table>
</div>
见this fiddle。由于我不理解的原因,文本输入框不可编辑。我已经尝试了两种不同的方式,如上所示:value
和fields[key]
。 value
根本不可编辑,fields[key]
将允许一次击键,然后它会模糊。我究竟做错了什么?谢谢。
答案 0 :(得分:5)
SET回答了为什么会发生这种情况,但实现所需行为的解决办法是维护一个单独的密钥数组,然后运行ng-repeat off这些密钥。我添加了一些用于测试的文本字段,以便向$scope.fields
如果您的要求是字段数可能会发生变化,您可以使用$ watch在属性计数更改时动态设置密钥。
标记
<div ng-app="app" ng-controller="Ctrl">
<table>
<th>key</th>
<th>value</th>
<tr ng-repeat="key in fieldKeys">
<td>{{key}}:</td>
<td><input type="text" ng-model="fields[key]"/></td>
</tr>
</table>
<div><h6>Add a field</h6>
key: <input type="text" ng-model="keyToAdd" /><br />
value: <input type="text" ng-model="valueToAdd" />
<button ng-click="addField()">Add Field</button>
</div>
</div>
控制器
var app = angular.module('app', []);
app.controller('Ctrl', function($scope) {
$scope.fields = {
foo: "foo",
bar: "bar",
baz: "baz"
};
$scope.fieldKeys = [];
$scope.setFieldKeys = function() {
var keys = [];
for (key in $scope.fields) {
keys.push(key);
}
$scope.fieldKeys = keys;
}
$scope.addField = function() {
$scope.fields[$scope.keyToAdd] = $scope.valueToAdd;
$scope.setFieldKeys();
$scope.keyToAdd = '';
$scope.valueToAdd = '';
}
$scope.setFieldKeys();
});
答案 1 :(得分:3)
您需要使用一组对象。希望你可以修改你的模型:
$scope.fields = [
{label: "foo", value: "foov"},
{label: "bar", value: "barv"},
{label: "baz", value: "bazv"}
];
<tr ng-repeat="field in fields">
<td>{{field.label}}:</td>
<td><input type="text" ng-model="field.value">
答案 2 :(得分:3)
它是可编辑的但是在每个键之后按下您的文本字段失去焦点,这样您就必须再次点击它以放置另一个字符。
之所以发生这种情况,是因为整个模板在任何模型中的每次更改后都会重新渲染。模板重新渲染后,目前无法知道应该关注哪个输入。因此,您应该创建这种方式,并且您可能希望编写指令以将焦点放在所选输入上。