Javascript 在控制器中重用角度事件
我在控制器中使用附加到作用域的以下事件:Javascript 在控制器中重用角度事件,javascript,angularjs,angularjs-directive,angularjs-scope,angularjs-service,Javascript,Angularjs,Angularjs Directive,Angularjs Scope,Angularjs Service,我在控制器中使用附加到作用域的以下事件: $scope.$on('$locationChangeStart', function( event ) { var answer = confirm('Are you sure?.') if (!answer) { event.preventDefault(); } 如何使此事件逻辑可重用,以便在多个控制器中使用?是服务还是工厂?使用指令并将其作为元素、属性或类附加到相关视图中是否更好。我怀
$scope.$on('$locationChangeStart', function( event ) {
var answer = confirm('Are you sure?.')
if (!answer) {
event.preventDefault();
}
如何使此事件逻辑可重用,以便在多个控制器中使用?是服务还是工厂?使用指令并将其作为元素、属性或类附加到相关视图中是否更好。我怀疑指令选项轻微违反了关注点分离。您可以在路由配置中创建一个参数。例如,
needConfirmation
$routeProvider
.when('/route1', {
templateUrl: 'page1.html',
controller: 'Page1Ctrl'
})
.when('/route2', {
templateUrl: 'page2.html',
controller: 'Page2Ctrl',
needConfirmation: true
})
.otherwise({
redirectTo: '/route1'
});
然后在run()
阶段:
$rootScope.$on('$routeChangeStart', function (event, next) {
if (next.needConfirmation) {
if (!confirm('Are you sure?')) {
event.preventDefault();
}
}
});
以下是一个完全有效的示例:
angular.module('demo',['ngRoute']);
angular.module('demo')
.config(函数($routeProvider){
$routeProvider
。当(“/route1”{
模板:“这是第1页”,
控制器:“Page1Ctrl”
})
。当(“/route2”{
模板:“这是第2页”,
控制器:“Page2Ctrl”,
需要确认:正确
})
.否则({
重定向到:'/route1'
});
});
angular.module('demo')
.run(函数($rootScope){
$rootScope.$on(“$routeChangeStart”,函数(事件,下一个){
如果(下一步,需要确认){
如果(!confirm('你确定吗?')){
event.preventDefault();
}
}
});
});
angular.module('demo')
.控制器('Page1Ctrl',函数(){
});
angular.module('demo')
.controller('Page2Ctrl',函数(){
});代码>
此事件是在URL更改之前广播的全局事件,您只需定义处理程序一次
如何使此事件逻辑可重用,以便在多个应用程序中使用它
控制器
这意味着这不需要在多个控制器中定义
为此使用module.run()
。您可以使用$rootScope
,它似乎适合您正在处理的此类事件
在初始化应用程序时,“每页”执行一次Module.run()。如果你以后做了你的应用SPA,你仍然是黄金
如果您遵循TDD,请参考以下创意链接:-
为什么不在控制器中
严格来说,他们的工作应该是使模型对视图可用
是服务还是工厂
服务、工厂等应仅用于帮助控制器、指令的对象。他们没有访问DOM作用域的权限
使用指令并将其作为元素附加是否更好,
相关视图中的属性或类。我怀疑这个指令
选项是对关注点分离的轻微违反
指令是本地的。它们增强了HTML元素。URL更改之类的事件是全局性的。可以为浏览器的位置字段创建什么可能的指令