我有一个配置,我希望能够注入Angular服务,指令等。这样做的最佳方法是什么?
我正在玩制作配置模块的想法:
'use strict';
angular.module('config', [])
但是我不确定如何构造将被注入的实际配置对象的对象文字:
angular.module('myModule', ['ngResource', 'config'])
.factory('myservice', function ($resource) {
return $resource(config.myservice,{}, {
// whatever
})
});
将config作为服务公开并注入它是否可以?
答案 0 :(得分:9)
我想说,策略会有所不同,具体取决于您拥有的配置类型,但您有多种选择:
如果您只需要几个常量,可以使用.value()
,如下所示:
var app;
app = angular.module("my.angular.module", []);
app.value("baseUrl", "http://myrestservice.com/api/v1");
//injecting the value
app.controller("MyCtrl", ['baseUrl', function (baseUrl) {
console.log(baseUrl); // => "http://myrestservice.com/api/v1"
}]);
查看更详细的答案here。
我个人喜欢做的是正常通过服务从其他地方获取我的配置。如果这是一个远程位置或只是静态信息,则无关紧要。
var app;
app = angular.module("my.angular.config", []);
app.service('Configuration', [function() {
return {
getbaseUrl: function() { return "http://myrestservice.com/api/v1" },
getConfig: function() {
return {
answer: 42,
question: "??"
}
}
}
}]):
编辑:外部获取的示例:
var app;
app = angular.module('my.module.config', []);
app.factory('ConfigurationData', ['$http', '$q', function(http, q) {
var deferredConfig = q.defer();
//error handling ommited
http.get('http://remote.local/config.json').success(function(data) {
return deferredConfig.resolve(data);
});
return {
getConfig: function() {
return deferredConfig.promise;
}
};
}]);
使用此服务,您可以将配置注入其他服务,但是,您可能会遇到计时问题,因为您必须在配置之前注入并解决服务提供的承诺:
var app;
app = angular.module("my.other.module", ['my.module.config']);
app.factory('MyAwesomeService', ['ConfigurationData', function(config) {
config.getConfig().then(function(config) {
//do something with your config.
});
}]);
你可以在这里获得更好的控制,因为你可以对不同的输入做出反应。同样,这取决于您的用例。如果您需要额外的逻辑来构建配置,可以在此处使用工厂。
最后,如果您想要更多地控制配置,可以制作一个
提供商可能非常有用,但我认为他们设计起来有点困难。考虑到应用程序运行所需配置中的baseUrl
,您可以为需要baseUrl
值的服务编写提供程序,如下所示:
var app;
app = angular.module('my.angular.module', []);
app.provider("RestServiceProvider", function(){
this.baseUrl = 'http://restservice.com';
this.$get = function() {
var baseUrl = this.baseUrl;
return {
getBaseUrl: function() { return this.baseUrl; }
}
};
this.setBaseUrl = function(url) {
this.baseUrl = url;
};
});
这可以让你在应用程序的配置阶段做很酷的事情:
app.config(['RestserviceProvider', function(restServiceProvider) {
restServiceProvider.setBaseUrl('http://wwww.myotherrestservice.com');
}]);
您在服务/控制器/等中获取的每个实例。 RestService
的{{1}}现在将从您注入它的那一刻起配置阶段设置baseUrl
。
如需更详细的概述,我建议gist。
答案 1 :(得分:7)
创建仅具有服务或指令(或两者)的独立模块是制作与应用程序无关的角度代码的好方法。如果你这样做,你可以轻松地获取.js文件并将其放入任何项目中,你需要做的只是将它注入你的应用程序,它才能正常工作。
做类似的事情:
angular.module('config', [])
.factory('config', function() {
return {
theme : 'nighttime',
cursor : 'sword',
...
};
});
然后你可以将它注入任何类似的应用程序:
angular.module('myModule', ['config'])
.factory('myservice', function (config) {
var theme = config.theme;
var cursor = config.cursor;
// do stuff with night-time swords!
});
这实际上是angular-ui团队如何打包所有指令,每个指令都包含在自己的模块中,这使得其他人可以轻松地获取该代码并在其所有应用程序中重复使用。