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

带有ng-form的有角ng-repeat,在控制器中访问验证

燕嘉颖
2023-03-14
问题内容

我正在尝试使用生成一个可编辑列表ng-repeat。我想提醒用户在继续操作之前更新所有编辑内容,因此我正在使用ng- form动态创建“嵌套”表单,因为文档说我可以在这些动态创建的输入上使用验证。

尽管这似乎可以在HTML中运行,但我看不到如何在控制器中访问那些动态创建的表单和相关的验证字段。具体来说,当用户更改输入时,我使用$
dirty属性形式调出一个按钮来告诉用户提交更改。到目前为止,一切都很好。但是,一旦提交更改,我想$setPristine()在字段上指示已设置更改。在允许提交主要表单之前,可能还有其他方法可以确保对每个输入进行更改,但这是我能想到的最好的方法。

不幸的是,即使文档说如果我命名ng-form,它将被传播到$scope对象,但我找不到找到它的方法。 $scope.dynamic_form未定义。

这是一个显示我的意思的朋克:

nk

谢谢!

[编辑]只是为了增加问题,此特定示例的工作原理是将其添加到ng-click动态创建的输入中:

ng-click="namesForm.name.$setPristine();clean()"

但是我仍然无法访问控制器中动态创建的表单。例如,我想向添加一个监视程序,namesForm.name.$pristine以便mainForm.$setValidity(false)在子表单$dirty阻止用户提交所有子表单更改之前阻止用户提交主表单时可以进行设置。

简而言之,问题是如何在父控制器中访问动态创建的嵌套ngForm的验证值?


问题答案:

2015年1月17日更新:

正如评论所指出的勒布朗梅内塞斯 角1.3 现在支持插值formngForminput指令。

这意味着使用表达式来命名您的元素:

<div ng-form="namesForm_{{$index}}" ng-repeat="name in names">
    <input type="text"
           name="input_{{$index}}_0"></input>
    <!-- ... -->
</div>

将按预期工作:

$scope['namesForm_0']
$scope.namesForm_1

// Access nested form elements:
$scope.namesForm_1.input_1_0
...

Angular <= 1.2的原始答案:

使用表格,ngFormController很快就会变得棘手。

您需要注意,可以动态添加表单元素和输入,但不能动态 命名它们 -插值在ngFormor name指令中不起作用。

例如,如果您尝试像这样动态命名嵌套表单:

<div ng-form="namesForm_{{$index}}" ng-repeat="name in names">
    <!-- ... -->
</div>

而不是像这样在作用域上使所有嵌套表单可用:scope['namesForm_0']您只能访问具有文字名称的单个(最后一个)表单scope['namesForm_{{$index}}']

在你的情况,你需要创建一个将随着加入自定义指令ngForm来处理设置$pristine$$invalid该窗体实例。

JavaScript:

该指令将监视$dirty其表单的状态,以设置状态$validity以防止在脏时提交,并$pristine在按下“清洁”按钮时处理设置状态。

app.directive('formCleaner', function(){
    return {
        scope: true,
        require: '^form',
        link: function(scope, element, attr){
            scope.clean = function () {
                scope.namesForm.$setPristine();
            };

            scope.$watch('namesForm.$dirty', function(isDirty){
                scope.namesForm.$setValidity('name', !isDirty);
            });
        }
    };
});

HTML:

然后,对HTML的唯一更改就是添加formCleaner指令。

因此,从此更改原始HTML:

<body ng-controller="MainCtrl">
    <form name="mainForm" submit="submit()">
        <h3>My Editable List</h3>
        <div ng-form="namesForm"
             ng-repeat="name in names">
            <!-- ... -->
        </div>
        <button class="btn btn-default" type="submit">Submit</button>
    </form>
</body>

为此,在form-cleaner旁边添加ng-form

<body ng-controller="MainCtrl">
    <form name="mainForm" submit="submit()">
        <h3>My Editable List</h3>

        <!-- Add the `form-cleaner` directive to the element with `ng-form` -->
        <div form-cleaner
             ng-form="namesForm"
             ng-repeat="name in names">
            <!-- ... -->
        </div>
        <button class="btn btn-default" type="submit">Submit</button>
    </form>
</body>

这是显示新行为的更新的Plunker:http
://plnkr.co/edit/Lxem5HJXe0UCvslqbJr3?p=preview



 类似资料:
  • 问题内容: 我有一个带有不同事件的JSON对象,如下所示: 该对象存储在我的控制器的$ scope.events中。 现在,我循环此数组以构建事件列表: 我的目标是每天将{{event.date}}作为列表分隔符显示一次。因此,在此示例中,它应如下所示: 2014-11-04(分隔线) 第一次进入 第二次进入 2014-11-05(分隔线) 第三次进入 2014-11-06(分隔线) 第四次进入

  • 问题内容: 我想使用父列表(foos)的索引作为子列表(foos.bars)中函数调用的参数。 我发现了有人建议使用$ parent。$ index的帖子,但不是的属性。 如何访问父级的索引? 问题答案: 我的示例代码是正确的,问题出在我的实际代码中。不过,我知道很难找到这样的例子,所以我在回答别人的情况。

  • 问题内容: 嗨,我有一个简单的ng-repeat-start和end用例,并且工作正常,当我想添加一个内部ng-repeat时出现了问题。这是我的代码 内部ng-repeat到td元素中不起作用,在检查html源代码时看到ngRepeat注​​释,但未创建td元素。 我的丑陋的解决方法(假设我知道该向量的大小)是: 问题答案: 从那时起,我不确定是否使用角度1.1.6,并且在1.1.5或1.0.7

  • 问题内容: 有没有什么好方法可以使用angular过滤列表而不使用ng- repeat?我不想首先使用javascript绘制列表,但是之后我想使用angular对其进行过滤。 例: 我想使用搜索框来过滤现有的html。 (一般请不要使用ng-repeat或jQuery给出任何示例) 问题答案: 您可以编写一个简单的指令来处理显示/隐藏: 并以这种方式使用它: 使用指令有两个好处: 1)。您不必在

  • 问题内容: 我需要从控制器访问已在模板(ng-repeat内)中过滤的数据。 这就是我的意思: 我的模板中有此表: 然后我有一个用于按性别过滤数据的 这样可以。 如果有人选择其中一个选项,我需要对过滤后的结果进行处理。这就是为什么我的控制器中有一个$ watch来查找过滤器查询的更改的原因: 我的问题是: 如何从控制器访问FILTERED内容? 我最好这样,而不必在控制器中执行其他“过滤”操作…(

  • 问题内容: 我写了下面的代码 我知道它在ng- controller之外,因此我无法绑定数据,但是我的应用程序需要calanderCtrl控制器。我想将此值置于范围内,以便我也可以在其他控制器中使用它。我该怎么做呢? 问题答案: 您可以为此使用发布订阅模式。这样,您避免将变量放在rootscope上。 模板加载时,控制器将被调用。 现在如何运作: Angular不共享范围。每个控制器都有自己的单独