我找到了第一个Angular应用程序的方法,其中一个服务(用于生成SQL查询字符串)需要使用在constant
块中声明的模式进行初始化。目前架构/配置尚未最终确定,因此我正在进行一些处理,然后将结果提供给服务中的私有变量。
在这样做时,我想要一些关于最佳实践的指导。看起来有3种选择。
1)在工厂公开公共init
功能并从其他地方拨打电话
这是一种可能性,但我不想从其他地方启动工厂(这将是第一件加载的工厂)。
2)在工厂中使用IIFE
这可能很臭,但实际上效果很好。
angular.module('dataService', [])
.constant('DB_CONFIG', {
// ...data used to bootstrap the service
})
.factory('sqlQueries',
['DB_CONFIG',
function(){
var privateStuff_;
(function(){
// do processing work on DB_CONFIG in here
privateStuff_ = result;
})();
return {
// no init function needed!
publicMethod1: publicMethod1
}
}
])
3)使用run
块
说实话,我对Angular的run
块感到困惑。据推测,此处声明的任何变量都可以在该模块上的任何工厂使用?目前尚不清楚。我可以将所有代码移动到运行块中,但无法真正看到好处。
有人可以澄清这里的最佳做法吗?
答案 0 :(得分:4)
初始化服务的最佳位置是配置块 - 这就是它们的用途。有5种服务:
为了设置您的服务以便在配置块中注入和初始化,您应该实现“提供者”。
示例:
var app = angular.module('app', []);
app.provider('dataService', function() {
var privateStuff_;
this.init = function(db_config) {
// do processing work on DB_CONFIG in here
privateStuff_ = result;
}
function publicMethod1() {
...
}
this.$get = function() {
return {
publicMethod1: publicMethod1
}
}
});
将DB_CONFIG设置为常量(否则,无法将其注入配置块):
app.constant('DB_CONFIG', {
...
});
然后在您的配置块中,注入提供程序,并使用DB_CONFIG配置它:
app.config(function(dataServiceProvider, DB_CONFIG) {
dataServiceProvider.init(DB_CONFIG);
});