gpt4 book ai didi

angularjs - 使用模块时如何扩展或隔离 AngularJS 中的常量值?

转载 作者:行者123 更新时间:2023-12-02 10:20:42 25 4
gpt4 key购买 nike

为了保持代码简洁,我习惯在 AngularJs 应用程序中将 url 定义为常量,如下所示:

var myApp = angular.module('myApp', ['myModule']);
myApp.constant('URL', {
google: 'http://www.google.com',
facebook: 'http://www.facebook.com'
});

现在,这工作正常,但是当我在模块中定义(和使用)这个常量时,我​​遇到了问题:

var myModule= angular.module('myModule', []);
myModule.constant('URL', {
twitter: 'http://www.twitter.com'
});

因为,现在当我想在指令(在我的模块内)中使用 URL.twitter 常量时,它不再可用,因为“myApp”中 URL 常量的定义已覆盖该值。例如,当我创建指令时:

myModule.directive('myDirective', function(){
return {
template: '<div></div>',
controller: function(URL){
console.log(URL.twitter); // logs undefined when used within 'myApp'
}
};
});

查看实例:http://plnkr.co/edit/xiOGVWfJ4GupSvkTs0Ic?p=preview

将“myModule”视为我包含在项目中的第三方模块。如果我不小心对常量使用了相同的名称,那么整个事情就会被破坏。

如何克服这个用例,而不必为同一目的使用不同的名称?

最佳答案

我认为问题归结为:

第三方模块(不是我编写的)将“URL”定义为常量。

我将此模块作为依赖项包含在我的应用程序中,并定义了 URL(不知道 URL 已定义):

var app = angular.module('myApp', ['thirdPartyModule']);
app.constant('URL', { twitter: 'www.twitter.com'});

突然间,应用程序崩溃并停止工作。

如何避免这个陷阱?

答案:

您可以使用 Angular 的注入(inject)器来确定常量是否已经定义:

angular.module('myApp', ['thirdPartyModule']);
var injector = angular.injector(),
url = injector.has('URL') ? injector.get('URL') : {};

上面的代码将保证返回一个对象 - 要么是第三方模块中定义的 URL,要么是空对象文字(如果未定义)。

然后,您可以按如下方式扩展“URL”:

angular.extend(url, { twitter: 'www.twitter.com' });

注意事项:

如果 URL 之前未定义或在第三方模块中定义为对象文字,则此方法将起作用。如果 URL 先前被定义为基元(即字符串),则这将不起作用。

不幸的是,我想不出一种干净的方式来防范这种情况。我建议根本不要覆盖以前定义的常量,并依靠命名约定来使您的注入(inject)器独一无二。例如,对于您的常量、服务、提供程序和工厂,请使用唯一的前缀,以减少命名冲突的可能性:

var app = angular.module('tgApp', ['thirdPartyModule']);
app.constant('tgURL', { ... });

关于angularjs - 使用模块时如何扩展或隔离 AngularJS 中的常量值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24327079/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com