Angular.js - 表单验证会发出任何事件吗?

Angular.js - does form validation emit any events?

提问人:fxck 提问时间:7/15/2013 最后编辑:fxck 更新时间:10/24/2017 访问量:3740

问:

问题是,我正在使用 ui-router,我有两个视图,一个是工具栏,第二个是表单的内容。

现在我想在工具栏中有一个保存按钮,如果表单不是,它将被禁用。但这两者的范围完全不同,就像:$valid

  • 根范围
    • 工具栏范围
    • 内容范围(与form.$valid)

所以我想我应该通过倾听表单发出的某种$valid事件来处理它。

根据 Vojta 在这里所说的,这些事件应该存在,但我在任何地方都找不到它们。看着这个,我没有看到任何事件......

我也许可以

$scope.$watch('form.$valid', function(newVal, oldVal) {
   $scope.$emit('validityChange', {'form':newVal});
});

但感觉使用事件而不是这样会更好

或者我应该尝试完全不同的东西?请注意,我不能将工具栏的 ui-view 放在内容的 ui-view 中。因此,两个 UI 视图不能具有相同的范围。

JavaScript 验证 angularjs angularjs-scope angular-ui

评论


答:

0赞 Vilmos Ioo 10/24/2013 #1

要直接回答问题: 我不知道angularjs中的原生表单事件。但是,如您所知,您可以轻松创建自己的事件,这将解决您的问题。

但这是我的建议: 您正在尝试创建两个控制器以相互通信。使用事件可能是错误的方法。事件实际上应该用于应用程序范围的通知,例如身份验证。

可以将窗体和提交按钮重构为共享同一控制器的两个指令。虽然它们不会共享作用域,但它们将共享可用于通信的控制器对象。我会这样做。

另一种方法是将两个作用域相互嵌套。将表单代码移动到更高级别的控制器中。喜欢这个:

  • 根范围
    • main // 您的表单代码在这里
      • 工具栏 // 提交按钮可以访问功能
      • content // 表单可以访问功能

希望对您有所帮助!

评论

0赞 Vilmos Ioo 1/28/2014
这个答案不合适吗?
0赞 TeJas 10/24/2017 #2

假设您的两个视图必须具有不同的状态,并且它们都位于同一个主控制器和主 HTML 页面中,您可以使用它们的状态名称和 ng-if 来指定您的条件。

假设“内容”状态适用于您的内容视图。

现在,在包含工具栏的 HTML div 标签中,在保存按钮字段中提及一个条件,类似于以下内容,即

ng-if = $state.current.name === 'content' && 'nameOfYourForm'.$valid 

如果满足此条件,则间接表示您的表单有效。

但是,您必须在 run 方法中编写它,该方法应在与模块声明(即)相同的 js 文件上声明。

angular.module('nameOfModule' , ['dependency1', ..]). run(run)

然后在 run 方法中,注入 $rootScope 并$state,并声明和定义它,如下所示:

function run(stateHandler, .. ,$rootScope, $state) {
    $rootScope.$state = $state;
}