AngularJS:动态添加的字段未在FormController上注册

Ang*_*hef 29 angularjs angularjs-directive

我在AngularJS中有以下静态表单:

<form name="myForm" class="form-horizontal">

  <label>First Name:</label>
  <input type="text" name="first_name" ng-model="entity.first_name">

  <label>Last Name:</label>
  <input type="text" name="last_name" ng-model="entity.last_name">

</form>
Run Code Online (Sandbox Code Playgroud)

Angular为我创建了FormController并将其发布到范围内(在表单名称下).这意味着我可以访问以下属性:

$scope.myForm.first_name.$error
$scope.myForm.last_name.$invalid
...
Run Code Online (Sandbox Code Playgroud)

这超级有用!

但在我的情况下,我正在使用指令动态构建表单:

<form name="myForm" class="form-horizontal">

  <field which="first_name"></field>
  <field which="last_name"></field>

</form>
Run Code Online (Sandbox Code Playgroud)

<field>指令不解决实际<input>元素,直到过了一段时间(我已经从服务器获得的一些数据后,链接的指令等).

这里的问题是在窗体控制器上没有定义任何字段属性,就像动态字段没有在FormController中注册一样:

// The following properties are UNDEFINED (but $scope.myForm exists)
$scope.myForm.first_name
$scope.myForm.last_name
Run Code Online (Sandbox Code Playgroud)

知道为什么吗?任何解决方案/解决方法?

你可以在这个jsFiddle中看到整个代码:http:
//jsfiddle.net/vincedo/3wcYV/

Lan*_*don 25

更新7/31/2015自1.3以来已修复,请参见此处:https://github.com/angular/angular.js/issues/1404#issuecomment-125805732

原始答案 不幸的是,目前AngularJS的出现很短暂.Angular的表单验证不适用于动态命名字段.您可以在HTML底部添加以下内容,以确切了解正在发生的情况:

<pre>{{myForm|json}}</pre>
Run Code Online (Sandbox Code Playgroud)

如您所见,Angular没有正确获取动态输入名称.目前有一个涉及嵌套表单的工作可能会有点讨厌,但它确实有效(并且有一点额外的工作)会毫无困难地提交父表单.

如果您愿意,可以为此问题提供更多支持:GitHub问题 - 动态元素验证.无论哪种方式,这是代码:

http://jsfiddle.net/langdonx/6H8Xx/2/

HTML:

<div data-ng-app>
    <div data-ng-controller="MyController">
        <form id="my_form" name="my_form" action="/echo/jsonp/" method="get">
            <div data-ng-repeat="field in form.data.fields">
                <ng-form name="form">
                    <label for="{{ field.name }}">{{ field.label }}:</label>
                    <input type="text" id="{{ field.name }}" name="{{field.name}}" data-ng-model="field.data" required>
                    <div class="validation_error" data-ng-show="form['\{\{field.name\}\}'].$error.required">Can't be empty.</div>

                </ng-form>
            </div>
            <input type="submit" />
        </form>
    </div>
</div>
Run Code Online (Sandbox Code Playgroud)

JavaScript的:

MyController.$inject = ["$scope"];

function MyController($scope) {
    $scope.form = {};
    $scope.form.data = {};
    $scope.form.data.fields = []

    var f1 = {
        "name": "input_1",
        "label": "My Label 1",
        "data": ""
    };
    var f2 = {
        "name": "input_2",
        "label": "My Label 2",
        "data": ""
    };

    $scope.form.data.fields.push(f1);
    $scope.form.data.fields.push(f2);
}
Run Code Online (Sandbox Code Playgroud)