繁体   English   中英

模块间通信,Angular Js,工厂

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM