Javascript 在何处初始化角度服务中的数据?
我正在用我的第一个Angular应用程序找到我的方法,其中一个服务(用于生成SQL查询字符串)需要使用在其Javascript 在何处初始化角度服务中的数据?,javascript,angularjs,Javascript,Angularjs,我正在用我的第一个Angular应用程序找到我的方法,其中一个服务(用于生成SQL查询字符串)需要使用在其常量块中声明的模式进行初始化。目前,模式/配置尚未最终确定,因此我正在进行一些处理,然后将结果提供给服务中的一个私有变量 我想要一点关于做这件事的最佳实践的指导。看起来有3种选择 1)在工厂中公开公共init函数,并从其他地方调用它 这是可能的,但我不想从其他地方把工厂烧掉(这将是装载的第一件东西) 2)在工厂内部使用生命 这可能很臭,但实际上效果很好 angular.module('dat
常量
块中声明的模式进行初始化。目前,模式/配置尚未最终确定,因此我正在进行一些处理,然后将结果提供给服务中的一个私有变量
我想要一点关于做这件事的最佳实践的指导。看起来有3种选择
1)在工厂中公开公共init
函数,并从其他地方调用它
这是可能的,但我不想从其他地方把工厂烧掉(这将是装载的第一件东西)
2)在工厂内部使用生命
这可能很臭,但实际上效果很好
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)使用运行
块
老实说,我对Angular的run
块感到困惑。假设此处声明的任何变量都可用于该模块上的任何工厂?这还不清楚。我可以将所有代码移动到一个运行块中,但看不到真正的好处
有人能在此澄清最佳实践吗 初始化服务的最佳位置是配置块——这就是它们的用途。有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设置为常量(否则,无法将其注入配置块):
然后在配置块中,插入提供程序,并使用DB_config对其进行配置:
app.config(function(dataServiceProvider, DB_CONFIG) {
dataServiceProvider.init(DB_CONFIG);
});
我会用2。为什么它必须是一个iife块?你应该看看
provider
创建角度服务的方法。这可以在config
阶段进行一些初始化。@PeterAshwell我昨晚很晚才玩这个游戏,因为在阅读AngularAPI文档时对点火顺序有误解,所以使用了IIFE。我以为在.config和.run块被触发之前它就可以使用了…我错了。谢谢你…不过我还是不清楚。我的理解是,工厂
是提供者
的方便包装器,对吗?如果是这样的话,上面的模式给我带来了哪些不同于示例中代码的好处(我在这里使用了.constant
块)?是不是提供者可以被注入config
块,而工厂不能?对此进行一些澄清将非常有帮助。您仍在公开一个publicinit
方法,然后在主应用程序模块中激发该方法…可能这就是实现该方法的方法?您是正确的-工厂无法注入配置块。提供者允许您在缓存服务并将其注入(例如)控制器功能之前配置服务。主要的好处是清晰性和可测试性。不,init不是从服务公开的,因为可注入的是$get函数的返回值,而不是提供者本身。谢谢你的清楚解释。这些API文档现在将更有意义!
app.config(function(dataServiceProvider, DB_CONFIG) {
dataServiceProvider.init(DB_CONFIG);
});