Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在控制器中重用角度事件_Javascript_Angularjs_Angularjs Directive_Angularjs Scope_Angularjs Service - Fatal编程技术网

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更改之类的事件是全局性的。可以为浏览器的位置字段创建什么可能的指令