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
尝试是什么样子的?@MattWayvar$rootScope=$injector.get(“$rootScope”)代码>或var通知=$injector.get('notifications')
您是在返回函数的内部还是外部调用get()
?@MattWay-outside。您的$injector
尝试是什么样子?@MattWayvar$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
的库。