如何从工厂发出事件
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 年旧答案的副本,并且没有添加任何内容,同时也比现有的两个已接受答案更清晰。你认为你添加了什么信息?以上是关于如何从工厂发出事件的主要内容,如果未能解决你的问题,请参考以下文章
PyQt5 - 如何从工作线程发出信号以通过 GUI 线程调用事件