如何从父作用域检查包含ng的表单的有效性?

Mic*_*ssa 27 angularjs angularjs-scope

我有一个在我的应用程序中的多个视图共享的子窗体.在一个视图中,此子窗体单独显示,底部有一个后退/继续按钮,引导用户进入下一个子窗体.在另一个视图中,子窗体显示在与其他子窗体相同的页面上(基本上是一个长格式).

由于子窗体的html在两个视图中都是100%相同,因此我将其分成部分并ng-include用于渲染它.在仅显示带有后退/继续按钮的子窗体的视图中,我在父HTML的内部渲染后退/继续按钮.

在视觉上,一切正常,我能够访问在表单(user.email, user.password, user.etc...)中输入的所有数据.

问题是我根据用户是否正确填写了表单来启用/禁用"继续"按钮,这在"仅子表单"变体中不起作用,因为父作用域似乎没有能够访问表单的状态.如果我将按钮粘贴在局部,它可以工作,但我不想这样做,因为按钮不属于每个使用此部分的实例.

JSFiddle示例

在我的示例中请注意,红色边框内的提交按钮被禁用,直到在框中键入内容并且"表单无效?" 值更新,而蓝色边框内的按钮始终启用和"表格无效?" 价值是空白的.

如何myForm.$invalid从父作用域访问值?

Sco*_*oll 25

使用ng-include时创建的子范围是从父级隐藏表单函数.

除了使用指令之外,您还可以在父级中添加对象,但是将表单的名称设置为具有如下属性的对象非常重要:

<form name="myFormHolder.myForm">
Run Code Online (Sandbox Code Playgroud)

并在父控制器中

$scope.myFormHolder = {};
Run Code Online (Sandbox Code Playgroud)

然后以下应该工作:

$scope.myFormHolder.myForm.$pristine
Run Code Online (Sandbox Code Playgroud)

这样,在评估表单时,myForm.$ valid将在父表上设置.我相信我问了同样的问题:为什么在检查$ pristine或$ setDirty()时在ng-include中形成undefined?


joa*_*mbl 15

如果它是一个子表单,你可以将表单标签从子表单移动到主表单中:更新的JSFiddle

您还可以使用ngForm-directive嵌套表单:

在角形式中可以嵌套.这意味着当所有子表单都有效时,外部表单也是有效的.但是,浏览器不允许嵌套元素,因此angular提供了ngForm别名,其行为相同但允许表单嵌套.

结果是有点凌乱的imo.我宁愿创建一个带有新范围的'myForm'指令以避免使用$ parent - 例如:

myApp.directive('myForm',function(){
    return{ 
        restrict:'E',
        scope:{model:'='},
        templateUrl:'/form.html',
        replace:true
    }
});
Run Code Online (Sandbox Code Playgroud)

- 看到这个JSFiddle示例

  • 第一个选项对我不起作用,因为它是一个多页表单,其中每个"子表单"需要独立验证.但是,使用属性形式的`ng-form`指令嵌套(而不是嵌套实际的`<form>`标签)非常有效!`$ parent`部分只是一个坏例子 - 我有一个它绑定的实际对象.这是一个更好的例子,我将使用完整的解决方案:[JSFiddle](http://jsfiddle.net/BLVcG/2/).谢谢! (3认同)
  • 我认为这是Angular的一个真正的弱点.他们将验证放在表单元素而不是模型上.因此,如果要为同一模型定义多个表单,则必须重复所有验证逻辑. (2认同)