AngularJS:来自指令的广播事件

Sam*_*Sam 54 angularjs angularjs-scope

我见过人们从他们的代码中的任何地方这样做:

$rootScope.$broadcast('someEvent', someParameter); 
Run Code Online (Sandbox Code Playgroud)

然后在一些控制器中:

$rootScope.$on('someEvent', function(event, e){ /* implementation here */ });
Run Code Online (Sandbox Code Playgroud)

现在,我想从一个指令中扩展一个事件.在rootScope级别播放它是一种好习惯吗?我想在控制器中处理这个事件.我可以使用$ scope,还是我还要听$ rootScope?

Mar*_*cok 79

在我的例子中,我只想将一个事件从指令广播到视图的控制器,我在其中使用该指令.那么使用广播还有意义吗?

我会让指令在控制器上调用一个方法,该方法在使用该指令的HTML中指定:

对于使用隔离范围的指令:

<div my-dir ctrl-fn="someCtrlFn(arg1)"></div>

app.directive('myDir', function() {
  return {
    scope: { ctrlFn: '&' },
    link: function(scope, element, attrs) {
       ...
       scope.ctrlFn({arg1: someValue});
    }
Run Code Online (Sandbox Code Playgroud)

对于不使用隔离范围的指令:

<div my-dir ctrl-fn="someCtrlFn(arg1)"></div>

app.directive('myDir', function($parse) {
  return {
    scope: true,  // or no new scope -- i.e., remove this line
    link: function(scope, element, attrs) {
       var invoker = $parse(attrs.ctrlFn);
       ...
       invoker(scope, {arg1: someValue} );
    }
Run Code Online (Sandbox Code Playgroud)

  • @MarkRajcok我不会说事件导致耦合.事件更多地涉及发布/订阅体系结构,这是一种松散耦合的方案.换句话说,如果事件从未被触发,则不会调用事件处理程序,但它不会导致错误.与"&"控制器方法类似,如果没有调用它,则不会调用它.我会说'&'方法对事件的唯一好处是它不会"消耗"一个事件名称(这可能不是什么大问题). (12认同)
  • 谢谢@blesh.对我而言,"耦合"是一个糟糕的词汇选择.控制器需要知道事件名称,或者控制器需要知道属性名称(用于指定回调函数),因此我提到的优势并不存在. (2认同)

joa*_*mbl 13

通常不使用$ rootScope作为全局,除非你真的知道自己在做什么,否则不应该污染它.我建议您阅读本文关于服务,指令和控制器之间的通信.

  • 是的,如果你想从父控制器监听事件,你应该在指令中执行`$ scope.$ emit`,在父控制器中执行`$ scope.$ on` (7认同)