angular.js,无法编辑动态创建的输入字段

时间:2013-02-27 18:03:11

标签: angularjs

使用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。由于我不理解的原因,文本输入框不可编辑。我已经尝试了两种不同的方式,如上所示:valuefields[key]value根本不可编辑,fields[key]将允许一次击键,然后它会模糊。我究竟做错了什么?谢谢。

3 个答案:

答案 0 :(得分:5)

SET回答了为什么会发生这种情况,但实现所需行为的解决办法是维护一个单独的密钥数组,然后运行ng-repeat off这些密钥。我添加了一些用于测试的文本字段,以便向$scope.fields

添加更多属性

如果您的要求是字段数可能会发生变化,您可以使用$ watch在属性计数更改时动态设置密钥。

http://jsfiddle.net/aERwc/10/

标记

<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">

Fiddle

答案 2 :(得分:3)

它是可编辑的但是在每个键之后按下您的文本字段失去焦点,这样您就必须再次点击它以放置另一个字符。

之所以发生这种情况,是因为整个模板在任何模型中的每次更改后都会重新渲染。模板重新渲染后,目前无法知道应该关注哪个输入。因此,您应该创建这种方式,并且您可能希望编写指令以将焦点放在所选输入上。