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

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

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

谢谢, 穆尔塔萨

【问题讨论】:

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

标签: angularjs


【解决方案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 进行广播吗?
  • 我认为这是向上发出事件的唯一方法,这样同级别的控制器就不会捕获发出的事件 - 如果这是你想要的(在我的情况下)
  • 不确定方法是否正确,这可能会在控制器被销毁时造成泄漏,这个 $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 年旧答案的副本,并且没有添加任何内容,同时也比现有的两个已接受答案更清晰。你认为你添加了什么信息?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-24
  • 1970-01-01
  • 2016-03-07
  • 1970-01-01
  • 2018-10-21
  • 2018-03-22
  • 1970-01-01
相关资源
最近更新 更多