如何从工厂发出事件

Posted

技术标签:

【中文标题】如何从工厂发出事件【英文标题】:how to emit events from a factory 【发布时间】:2012-12-12 23:21:05 【问题描述】:

如何从工厂或服务发出事件。我无法将 $scope 注入工厂,因此无法发出事件。

我收到以下错误 - Unknown provider: $scopeProvider <- $scope

谢谢, 穆尔塔萨

【问题讨论】:

为什么不在控制器中观察服务变量而不是发出事件? @AndersBornholm 每个摘要周期都会触发角度的手表功能。根据应用程序的不同,摘要周期可能会经常发生。 Pubsub 提供了更好的沟通渠道。它不需要对每个摘要循环进行评估。 【参考方案1】:

注入 $rootScope 而不是 $scope,然后在 $rootScope 上发出它。

myApp.factory('myFactory', ['$rootScope', function ($rootScope) 
    $rootScope.$emit("myEvent", myEventParams);
]);

工厂无权访问当前的控制器/指令范围,因为没有。他们确实可以访问应用程序的根目录,这就是 $rootScope 可用的原因。

【讨论】:

这是正确的答案,工厂不能依赖控制器,因为它们的生命周期完全不同。【参考方案2】:

您不能将控制器的作用域注入到服务中。你可以做的是:

将作用域实例作为参数传递给您的服务函数之一:

例如

app.factory('MyService', function() 

   return 
      myFunction: function(scope) 
         scope.$emit(...);
         ...
      
    ;
);
将 $rootScope 注入您的服务:

例如

app.factory('MyService', ['$rootScope', function($rootScope) 

   return 
      myFunction: function() 
         $rootScope.$emit(...);
         ...
      
    ;
]);

【讨论】:

我不会从 rootscope 进行广播吗? 我认为这是向上发出事件的唯一方法,这样同级别的控制器就不会捕获发出的事件 - 如果这是你想要的(在我的情况下) @murtaza52 你真的想避免广播。见What's the correct way to communicate between controllers in AngularJS? 不确定方法是否正确,这可能会在控制器被销毁时造成泄漏,这个 $scope 对象会发生什么? @Thomas Decaux 首先我不会使用事件(注入服务是更好的方法),但如果你不保留对scope 的引用,它不应该造成内存泄漏【参考方案3】:

在你的工厂注入 $rootScope as-

myApp.factory('myFactory',function($rootScope)
return(
// use $rootScope as below to pass myEventParams to all below in hierarchy
$rootScope.$broadcast("myEvent",myEventParams);

)
]);

【讨论】:

如果没有给出适当的理由,我真的不明白投票答案是没有用的。非常不专业。 好吧,您的答案基本上是上面 5 年旧答案的副本,并且没有添加任何内容,同时也比现有的两个已接受答案更清晰。你认为你添加了什么信息?

以上是关于如何从工厂发出事件的主要内容,如果未能解决你的问题,请参考以下文章

如何从父级向子级发出事件?

Vue.js 从服务发出事件

PyQt5 - 如何从工作线程发出信号以通过 GUI 线程调用事件

Node.js - 如何从 app.js 外部发出 socket.io 事件?

如何在 vue3 中的“setup”方法中“发出”事件?

如何从一个进程向多个其他进程发出信号?