当前位置: 首页 > 面试题库 >

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

艾浩广
2023-03-14
问题内容

我在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>

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

$scope.myForm.first_name.$error
$scope.myForm.last_name.$invalid
...

这超级有用!

但就我而言,我正在使用指令 动态 构建表单:

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

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

</form>

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

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

// The following properties are UNDEFINED (but $scope.myForm exists)
$scope.myForm.first_name
$scope.myForm.last_name

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

您可以在此jsFiddle中查看整个代码:http :
//jsfiddle.net/vincedo/3wcYV/


问题答案:

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

原始答案
不幸的是,目前这是AngularJS的不足。Angular的表单验证不适用于动态命名的字段。您可以在HTML的底部添加以下内容,以查看发生了什么事:

<pre>{{myForm|json}}</pre>

如您所见,Angular没有正确输入动态输入名称。当前有一种涉及嵌套表单的工作,这种嵌套表单可能有点讨厌,但是它确实可以工作,并且(只需做一些额外的工作)就可以毫无困难地提交父表单。

如果需要,您可以为该问题提供更多支持:GitHub Issue-
动态元素验证。无论哪种方式,下面都是代码:

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>

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);
}


 类似资料:
  • 在VAADIN组件中,用户可以选择插入一到N个问题答案。 初始:第一个答案应有一个文本字段,带有按钮(“添加另一个答案”) 按下按钮时,应为第二个答案添加一个新的文本字段,以此类推。。。 我的问题是,如何在按钮按下时实现新文本字段的动态加载? 我添加了一张我如何想象这个问题的图片。

  • 问题内容: 我的表格中有3个字段。我有一个提交按钮和一个“添加其他字段”按钮。我知道我可以使用表单类中的方法添加字段。 我是Python和Django的新手,并且陷入了一个初学者的问题;我的问题是: 当我单击“添加其他字段”按钮时,添加其他字段的过程是什么? 是否需要再次呈现表单? 我如何以及何时打电话,甚至必须打电话? 如何将参数传递给? 问题答案: 你的表单必须基于从POST传递给它的一些变量

  • 我希望将动态字段存储到文档中,但每个文档可以有不同的字段。 例如: 如果我运行上述程序,mongodb文档如下所示。 但我想要的是字段名称应该是“field1”而不是这样的“df”。 这只是一个示例代码,所以我知道df值是什么,但实际上我不知道df值是什么。那么在存储时动态命名字段的方法是什么? 在Mongoengine中有一个类似的使用key作为值的问题,但是解决方案建议使用DictField(

  • 有没有办法动态设置@JsonProperty注释,例如: 或者我可以简单地重命名实例的字段吗?如果是这样,请给我一个主意。此外,可以以何种方式与序列化一起使用?

  • 问题内容: 看来这个问题已经被问过几次了,但是没有正确的答案。 我的情况:我正在使用ajax(出于某种原因不使用角度路由模板)将模板(带有html和脚本)初始化为div。 index.html(主要) template.html(模板) 当我单击按钮时,它将文件加载到容器中,但是出现错误 错误:[ ng:areq ]参数’TempCtrl’不是函数,未定义 尽管已将其添加到应用控制器中。 我如何动

  • 问题内容: 我不太确定如何处理此问题。我希望我能到达那里。 例如,我在一个页面上有一张充满地址的表。这些计数是动态的(可以是5或10或任何其他计数)。我希望可以在一页上进行编辑。 我的方法是创建wtforms一个表单编辑一个地址,并乘以它在Jinja2的和附加到HTML propertys并在 从itereation,这样我就可以提取人工数据的每一行,并把它放回我的形式,当我想评估一下。 因此,此