提问人:fxck 提问时间:7/15/2013 最后编辑:fxck 更新时间:10/24/2017 访问量:3740
Angular.js - 表单验证会发出任何事件吗?
Angular.js - does form validation emit any events?
问:
问题是,我正在使用 ui-router,我有两个视图,一个是工具栏,第二个是表单的内容。
现在我想在工具栏中有一个保存按钮,如果表单不是,它将被禁用。但这两者的范围完全不同,就像:$valid
- 根范围
- 工具栏范围
- 内容范围(与
form.$valid
)
所以我想我应该通过倾听表单发出的某种$valid事件来处理它。
根据 Vojta 在这里所说的,这些事件应该存在,但我在任何地方都找不到它们。看着这个,我没有看到任何事件......
我也许可以
$scope.$watch('form.$valid', function(newVal, oldVal) {
$scope.$emit('validityChange', {'form':newVal});
});
但感觉使用事件而不是这样会更好
或者我应该尝试完全不同的东西?请注意,我不能将工具栏的 ui-view 放在内容的 ui-view 中。因此,两个 UI 视图不能具有相同的范围。
答:
要直接回答问题: 我不知道angularjs中的原生表单事件。但是,如您所知,您可以轻松创建自己的事件,这将解决您的问题。
但这是我的建议: 您正在尝试创建两个控制器以相互通信。使用事件可能是错误的方法。事件实际上应该用于应用程序范围的通知,例如身份验证。
可以将窗体和提交按钮重构为共享同一控制器的两个指令。虽然它们不会共享作用域,但它们将共享可用于通信的控制器对象。我会这样做。
另一种方法是将两个作用域相互嵌套。将表单代码移动到更高级别的控制器中。喜欢这个:
- 根范围
- main // 您的表单代码在这里
- 工具栏 // 提交按钮可以访问功能
- content // 表单可以访问功能
- main // 您的表单代码在这里
希望对您有所帮助!
评论
假设您的两个视图必须具有不同的状态,并且它们都位于同一个主控制器和主 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;
}
评论