![](/img/trans.png)
[英]Angular JS - Is there any usecase for using services and factories together in same module
[英]Inter-module Communication, Angular Js, Factories
我有一个使用Angular开发的简单应用程序。 我已经尽可能简化了以下内容。 我正在尝试使全局可用的库成为可注入的 (没什么特别的):
我的app.module.js
文件简单定义为:
angular.module('dogApplication', [
'dogModule',
'dogSelection'
]);
index.html
文件的定义如下(为便于阅读而删除):
<html lang="en" ng-app="dogApplication">
<head>
<!-- ... -->
<script src="app/app.module.js"></script>
<script src="app/dogs/dog.module.js"</script>
<script src="app/dogs/dog.factory.js"</script>
<script src="app/dogSelection.module.js"></script>
<!-- controllers then imported -->
</head>
<body>
<!-- content -->
</body>
</html>
.module
文件定义了附加了每个其他组件,控制器,工厂等的模块,其中app.module.js
是“主要”模块附件。
dog.factory.js
的定义如下:
angular
.module('dogModule')
.factory('dog', function($window) {
// do logic defined by James Hill in linked article
return friendly;
});
然后,我有一个控制器:
angular
.module('dogSelection')
.controller('dogSelectionController', ['$scope', 'dog', function ($scope, dog) {
if (dog)
{
console.log('it worked');
}
}])
访问该应用程序时,出现一条错误的错误消息,我无法完全解决:
angular.js:13920 Error: [$injector:unpr] Unknown provider: dogProvider <- dog <- dogSelectionController
http://errors.angularjs.org/1.5.8/$injector/unpr?p0=dogProvider%20%3C-%20dog%20%3C-%20dogSelectionController
at angular.js:68
at angular.js:4511
at Object.getService [as get] (angular.js:4664)
at angular.js:4516
at getService (angular.js:4664)
at injectionArgs (angular.js:4688)
at Object.invoke (angular.js:4710)
at $controllerInit (angular.js:10354)
at nodeLinkFn (angular.js:9263)
at angular.js:9673
通过上述设置,为什么通过DI的dogSelectionController
无法使用dog
服务?
我知道.factory( //...
方法中的代码可以正常工作,因为我可以将其附加到控制器定义的末尾;但是,我希望工厂在整个应用程序中都可用。这可能吗?
我看到的第一个问题是模块后需要一个数组。 即使没有模块依赖性。 所以它是.module('dogSelection', [])
而不是.module('dogSelection')
-我看到的下一个问题是,您需要在注入狗之前定义模块使用的模块。 如果没有定义dob来自dog的模块,则会抛出类似您所见的错误。 像这样
模块:
angular.module('dogModule', [])
.factory('dog', function($window)
{
});
控制器:
angular.module('dogSelection', [
'dogModule'
])
.controller('dogSelectionController', ['$scope', 'dog', function ($scope, dog)
{
}]);
看起来'dogSelectionController'
注入器应该从['$scope', 'leaflet'
更改为['$scope', 'dog'
。 狗工厂没有命名为'leaflet'
。
更新:
作为共享工厂的一种解决方法,是将工厂直接放在主应用程序模块上。 我现在正在使用手机,因此目前无法给出更好的答案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.