AngularJS中的模块和命名空间/名称冲突

Bri*_*man 49 namespaces collision angularjs angularjs-module

考虑以下jfiddle http://jsfiddle.net/bchapman26/9uUBU/29/

//angular.js example for factory vs service
var app = angular.module('myApp', ['module1', 'module2']);

var service1module = angular.module('module1', []);

service1module.factory('myService', function() {
    return {
        sayHello: function(text) {
            return "Service1 says \"Hello " + text + "\"";
        },
        sayGoodbye: function(text) {
            return "Service1 says \"Goodbye " + text + "\"";
        }
    };
});

var service2module = angular.module('module2', []);

service2module.factory('myService', function() {
    return {
        sayHello: function(text) {
            return "Service2 says \"Hello " + text + "\"";
        },
        sayGoodbye: function(text) {
            return "Service2 says \"Goodbye " + text + "\"";
        }
    };
});

function HelloCtrl($scope, myService) {
    $scope.fromService1 = myService.sayHello("World");
}

function GoodbyeCtrl($scope, myService) {
    $scope.fromService2 = myService.sayGoodbye("World");
}?
Run Code Online (Sandbox Code Playgroud)

我有2个模块(module1和module2).module1和module2都定义了一个名为myService的服务.当两个模块都导入myApp时,这似乎会在Angular中的myService上创建名称冲突.看来AngularJs只使用第二个服务定义而没有警告您可能存在的问题.

非常大的项目(或者只是重用模块)会有名称冲突的风险,这可能很难调试.

有没有办法使用模块名称为名称添加前缀,以便不会发生名称冲突?

Jim*_*ley 62

截至今天,AngularJS模块不提供任何类型的命名空间,以防止不同模块中的对象之间的冲突.原因是AngularJS应用程序有一个注入器,它保存所有对象的名称而不考虑模块名称.

AngularJS开发指南说:

为了管理依赖关系创建的责任,每个Angular应用程序都有一个注入器.注入器是一个服务定位器,负责构建和查找依赖项.

正如您所提到的,将模块注入主/ app模块时可能会产生令人讨厌的错误.当碰撞发生时,它们是沉默的,胜者是由最后一个模块注入的.

所以不,没有内置的方法来避免这些碰撞.也许这将在未来发生.对于更有可能出现此问题的大型应用程序,您认为命名约定是最佳工具是正确的.考虑属于模块或功能区域的对象是否可能使用短前缀.

  • 正如其他帖子中所提到的,通过在服务名称前面加上引发它的模块,例如`module2.MyService`,可以在野外存在"hacky"解决方案.毕竟,服务名称只是字符串键.依赖模块 - 上面示例中的"myApp" - 将定义`MyService`在实践中的工作方式.次优但可用. (5认同)