angularjs在不同文件中为同一个模块定义服务

Posted

技术标签:

【中文标题】angularjs在不同文件中为同一个模块定义服务【英文标题】:angularjs defining services for the same module in different files 【发布时间】:2014-06-16 04:31:40 【问题描述】:

我有两个文件,我在我的 Angular 应用程序中定义服务,但是当我尝试在我的指令中同时使用它们时,我收到一个错误,提示我找不到第二个定义的指令的服务提供者。似乎一项服务正在覆盖另一项服务。如果我将 service2.js 中的模块定义更改为 myapp.services2,那么它可以工作。我想我可以通过这种方式将多个工厂添加到同一个模块中。有人可以指出我做错了什么吗?

service1.js:

var services = angular.module('myapp.services',[]);
services.factory('Service1', function() 
    // service code
);

service2.js:

var services = angular.module('myapp.services',[]);
services.factory('Service2', function() 
    // service code
);

mydirective.js:

angular.module('myappdirective', []).directive('myapp', ['Service1', 'Service2',
function(service1,service2) 
    // directive code
]);

【问题讨论】:

您定义了服务模块两次。您只需定义一次(在一个文件中)。在我最近的项目中,我将 var services = angular.module 行移到了它自己的 js 文件中(肯定过分了)。 那不应该是第二次查找而不重新定义吗? 如果你删除注入数组,我认为它会这样工作 - angular.module('myapp.services'); 我会试试看,但为什么会这样(这里是 Angular 的新手) 哈!这只是他们建造它的方式。这来自文档:请注意,使用 angular.module('myModule', []) 将创建模块 myModule 并覆盖任何名为 myModule 的现有模块。使用 angular.module('myModule') 检索现有模块。 【参考方案1】:

这是可能的,但容易出错,因此不推荐

对你已经在做的事情做一些小的修改

只是不要在service1.js以外的其他文件中重新声明module变量或将模块定义放到自己的文件中,并按照Module.js、services.js、指令的顺序包含这些JS文件。 js 就可以了

【讨论】:

【参考方案2】:

这是来自文档:

请注意,使用 angular.module('myModule', []) 将创建模块 myModule 并覆盖任何名为 myModule 的现有模块。使用 angular.module('myModule') 检索现有模块。

在这里找到: https://docs.angularjs.org/guide/module

【讨论】:

有趣的是,现有的实现几乎让每个人都感到困惑。 angular.createModule(<module_name>, <dependencies>), angular.retrieveModule(<module_name>) 不会提出这么多问题! ;) 错误地添加[] 也很难检测到 我认为这很明显。我习惯于使用 JQuery,所以像 .width().width(newWidth) 这样的事情非常简单,至少对我来说是这样。此外,它只会让你吃惊一次。下次你看到注入器错误告诉你找不到模块时,你会知道你又做了一次;)

以上是关于angularjs在不同文件中为同一个模块定义服务的主要内容,如果未能解决你的问题,请参考以下文章

Angularjs[12] - 模块

如何在共享模块中定义覆盖服务

AngularJs中的模块定义,一个页面加载多个ng-app

AngularJs将来自单独文件的多个指令注入一个公共模块

在 AngularJS 中为 $http 服务使用 JSONP 方法

如何在 AngularJS 中为未定义的表达式值显示占位符?