使用angular.js,我有一个动态的表单字段列表,我想显示给用户进行编辑(以及以后的提交):
var app = angular.module('app', []);
app.controller('Ctrl', function($scope) {
$scope.fields = {
foo: "foo",
bar: "bar",
baz: "baz"
};
});
Run Code Online (Sandbox Code Playgroud)
和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>
Run Code Online (Sandbox Code Playgroud)
看到这个小提琴.由于我不理解的原因,文本输入框不可编辑.我已经尝试了两种不同的方式,如上所示:value和fields[key].value根本不可编辑,并fields[key]允许一次击键然后它模糊.我究竟做错了什么?谢谢.
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>
Run Code Online (Sandbox Code Playgroud)
调节器
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();
});
Run Code Online (Sandbox Code Playgroud)
它是可编辑的,但在按下每个键后,您的文本字段会失去焦点,因此您必须再次单击它才能放置另一个字符。
发生这种情况是因为在任何模型中每次更改后整个模板都会重新渲染。并且在模板重新渲染后,目前无法知道应该关注哪个输入。因此,您应该以这种方式创建,并且您可能需要编写指令来将焦点集中在选定的输入上。