我正在寻找我的第一个 Angular 应用程序的方法,其中一项服务(用于生成 SQL 查询字符串)需要使用在其 constant
block 中声明的模式进行初始化。目前架构/配置尚未最终确定,所以我正在做一些处理,然后将结果提供给服务内的私有(private)变量。
在执行此操作时,我想要一些关于最佳实践的指导。看起来有 3 个选项。
1) 在工厂公开一个公共(public)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
block
老实说,我对 Angular 的 run
block 感到困惑。据推测,此处声明的任何变量都可用于该模块上的任何工厂?这还不清楚。我可以将所有代码移到一个运行 block 中,但看不到真正的好处。
谁能在这里阐明最佳实践?
最佳答案
初始化服务的最佳位置是配置 block - 这就是它们的用途。有5种服务:
- 工厂
- 服务
- 提供者
- 值(value)
- 不变
为了设置您的服务以便它可以在您的配置 block 中注入(inject)和初始化,您应该实现一个“提供者”。
例子:
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 设置为常量(否则,它无法注入(inject)到您的配置 block 中):
app.constant('DB_CONFIG', {
...
});
然后在您的配置 block 中,注入(inject)提供程序,并使用 DB_CONFIG 对其进行配置:
app.config(function(dataServiceProvider, DB_CONFIG) {
dataServiceProvider.init(DB_CONFIG);
});
关于javascript - 在哪里初始化 Angular 服务中的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28187959/