AngularJS:注入参数和$injector的区别
AngularJS: difference between injection parameter and $injector
就像这个人 posted here 一样,我使用 Angular Material 的 $md-toast 服务在 API 调用 return 错误时通知用户。我得到 "Circular dependency found" 并找到了(之前引用的)文章。
有什么区别
.factory('toastHttpInterceptor', function ($mdToast) {
return {
responseError: function(response) {
$mdToast.showSimple('Error');
}
};
});
和
.factory('toastHttpInterceptor', function ($injector) {
return {
responseError: function(response) {
var $mdToast = $injector.get('$mdToast');
$mdToast.showSimple('Error');
}
};
});
??第二个如何解决"Circular dependency found"问题?
第二个删除循环依赖,因为加载模块时,首先解析对工厂的调用,因此模块理解:
toastHttpInterceptor <- injector
而直接或间接地,您的 mdToast 将具有此依赖路径:
mdToast <- ... <- toastHttpInterceptor
但是当该代码被单独调用时,mdToast 被 lazily 解析。你得到引用 lazily 所以你可以使用它,直到你需要它时才获得它,相反在定义时获得它。
所以:
- 加载时,避免在注入定义上有圆形路径。这样的注入会被整体处理,可能会失败。
- 修复涉及您知道
$mdToast
将存在,尽管未指定为依赖项(因为您不能),并在代码执行中询问它(这将是 初始化;模块及其部分已经加载)。
就像这个人 posted here 一样,我使用 Angular Material 的 $md-toast 服务在 API 调用 return 错误时通知用户。我得到 "Circular dependency found" 并找到了(之前引用的)文章。
有什么区别
.factory('toastHttpInterceptor', function ($mdToast) {
return {
responseError: function(response) {
$mdToast.showSimple('Error');
}
};
});
和
.factory('toastHttpInterceptor', function ($injector) {
return {
responseError: function(response) {
var $mdToast = $injector.get('$mdToast');
$mdToast.showSimple('Error');
}
};
});
??第二个如何解决"Circular dependency found"问题?
第二个删除循环依赖,因为加载模块时,首先解析对工厂的调用,因此模块理解:
toastHttpInterceptor <- injector
而直接或间接地,您的 mdToast 将具有此依赖路径:
mdToast <- ... <- toastHttpInterceptor
但是当该代码被单独调用时,mdToast 被 lazily 解析。你得到引用 lazily 所以你可以使用它,直到你需要它时才获得它,相反在定义时获得它。
所以:
- 加载时,避免在注入定义上有圆形路径。这样的注入会被整体处理,可能会失败。
- 修复涉及您知道
$mdToast
将存在,尽管未指定为依赖项(因为您不能),并在代码执行中询问它(这将是 初始化;模块及其部分已经加载)。