一尘不染

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

angularjs

考虑以下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");
}​

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

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

有没有一种方法可以在模块名称前添加名称,以免发生名称冲突?


阅读 235

收藏
2020-07-04

共1个答案

一尘不染

到目前为止,AngularJS模块不提供任何类型的命名空间,以防止不同模块中的对象之间发生冲突。原因是AngularJS应用具有单个注入器,该注入器保存所有对象的名称,而与模块名称无关。

AngularJS开发指南说:

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

正如您已经提到的,将模块注入您的主/应用程序模块时可能会导致讨厌的错误。发生碰撞时,它们将保持沉默,而获胜者则取决于最后注入的模块。

因此,没有避免这种冲突的内在方式。也许将来会发生。对于更容易出现此问题的大型应用程序,您是正确的,命名约定是您的最佳工具。考虑属于模块或功能区域的对象是否可以使用短前缀。

2020-07-04