Javascript 使用ngNotificationsBar时发现角度-循环依赖项

Javascript 使用ngNotificationsBar时发现角度-循环依赖项,javascript,angularjs,exception,Javascript,Angularjs,Exception,我尝试使用模块,我有如下代码: angular.module('app', [ uiRouter, Common.name, Components.name, angularMaterial, 'ngTable', 'gridster', 'ngNotificationsBar' ]) .factory('$exceptionHandler', ['notifications', function(notifications) {

我尝试使用模块,我有如下代码:

angular.module('app', [
    uiRouter,
    Common.name,
    Components.name,
    angularMaterial,
    'ngTable',
    'gridster',
    'ngNotificationsBar'
  ])
  .factory('$exceptionHandler', ['notifications', function(notifications) {
    return function(exception, cause) {
      notifications.showError({message: exception});
    };
  }]);
但有一个错误:


[$injector:cdep]发现循环依赖项:$rootScope从角度看,它的设计非常糟糕,在这一个上看起来。由于依赖关系,您无法以任何形式将
$rootScope
注入
$exceptionHandler

您可以使用
$injector
来解决这些类型的依赖性问题,您只需要确保在返回函数中使用注入的模块,以确保在调用
.get()
时,依赖模块已实际加载。例如:

// won't not be available here
var rootScope = $injector.get('$rootScope');

return function(exception, cause) {
  // will be available here
  var rootScope = $injector.get('$rootScope');
};

这是因为,
$injector
用于在运行时获取依赖关系。

从角度看,这是一个非常糟糕的设计。由于依赖关系,您无法以任何形式将
$rootScope
注入
$exceptionHandler

您可以使用
$injector
来解决这些类型的依赖性问题,您只需要确保在返回函数中使用注入的模块,以确保在调用
.get()
时,依赖模块已实际加载。例如:

// won't not be available here
var rootScope = $injector.get('$rootScope');

return function(exception, cause) {
  // will be available here
  var rootScope = $injector.get('$rootScope');
};

这是因为
$injector
用于在运行时获取依赖项。

有一个很好的干净的面向对象设计来避免循环依赖项:使用。创建一个可以附加处理程序的通用服务,并从
run
块对其进行设置。基本上,所有其他解决方案都提出了类似的建议,但使用角度之外的全局变量,或者绕过自动依赖项注入

角度模块(“应用程序”,[]) .factory(“通知”,函数($rootScope){ $rootScope.notifications=[]; 函数showMessage(msg){ $rootScope.notifications.push(msg); } 返回{showMessage}; }) .factory($exceptionHandler),函数(MyExceptionService){ 返回函数(e,原因){ MyExceptionService.fire(e,原因); }; }) .factory(“MyExceptionService”,function()){ 常量处理程序=[]; 返回{ addHandler(h){handlers.push(h);}, 火(e,原因){handlers.forEach(h=>{h(e,原因);}} }; }) .controller(“MyCtrl”,函数($scope){ $scope.clicked=()=>{ 抛出新错误(“出错”); }; }) .run(函数(MyExceptionService、通知){ MyExceptionService.addHandler(错误=>{ notifications.showMessage({message:err.message}); }); });

弄错
错误:
{{item}}

有一种非常干净的面向对象设计,可以避免循环依赖关系:使用。创建一个可以附加处理程序的通用服务,并从
run
块对其进行设置。基本上,所有其他解决方案都提出了类似的建议,但使用角度之外的全局变量,或者绕过自动依赖项注入

角度模块(“应用程序”,[]) .factory(“通知”,函数($rootScope){ $rootScope.notifications=[]; 函数showMessage(msg){ $rootScope.notifications.push(msg); } 返回{showMessage}; }) .factory($exceptionHandler),函数(MyExceptionService){ 返回函数(e,原因){ MyExceptionService.fire(e,原因); }; }) .factory(“MyExceptionService”,function()){ 常量处理程序=[]; 返回{ addHandler(h){handlers.push(h);}, 火(e,原因){handlers.forEach(h=>{h(e,原因);}} }; }) .controller(“MyCtrl”,函数($scope){ $scope.clicked=()=>{ 抛出新错误(“出错”); }; }) .run(函数(MyExceptionService、通知){ MyExceptionService.addHandler(错误=>{ notifications.showMessage({message:err.message}); }); });

弄错
错误:
{{item}}

您的
$injector
尝试是什么样子的?@MattWay
var$rootScope=$injector.get(“$rootScope”)
var通知=$injector.get('notifications')
您是在返回函数的内部还是外部调用
get()
?@MattWay-outside。您的
$injector
尝试是什么样子?@MattWay
var$rootScope=$injector.get(“$rootScope”)
var通知=$injector.get('notifications')
在返回的函数内部还是外部调用
get()
吗?@MattWay-outside。我使用了
var-notifications=$injector.get('notifications')在函数insidead中,因此我不需要修改使用
$rootScope
的库。我使用了
var notifications=$injector.get('notifications')在函数insidead中,因此我不需要修改使用
$rootScope
的库。