Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/427.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在何处初始化角度服务中的数据?_Javascript_Angularjs - Fatal编程技术网

Javascript 在何处初始化角度服务中的数据?

Javascript 在何处初始化角度服务中的数据?,javascript,angularjs,Javascript,Angularjs,我正在用我的第一个Angular应用程序找到我的方法,其中一个服务(用于生成SQL查询字符串)需要使用在其常量块中声明的模式进行初始化。目前,模式/配置尚未最终确定,因此我正在进行一些处理,然后将结果提供给服务中的一个私有变量 我想要一点关于做这件事的最佳实践的指导。看起来有3种选择 1)在工厂中公开公共init函数,并从其他地方调用它 这是可能的,但我不想从其他地方把工厂烧掉(这将是装载的第一件东西) 2)在工厂内部使用生命 这可能很臭,但实际上效果很好 angular.module('dat

我正在用我的第一个Angular应用程序找到我的方法,其中一个服务(用于生成SQL查询字符串)需要使用在其
常量
块中声明的模式进行初始化。目前,模式/配置尚未最终确定,因此我正在进行一些处理,然后将结果提供给服务中的一个私有变量

我想要一点关于做这件事的最佳实践的指导。看起来有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
    块,而工厂不能?对此进行一些澄清将非常有帮助。您仍在公开一个public
    init
    方法,然后在主应用程序模块中激发该方法…可能这就是实现该方法的方法?您是正确的-工厂无法注入配置块。提供者允许您在缓存服务并将其注入(例如)控制器功能之前配置服务。主要的好处是清晰性和可测试性。不,init不是从服务公开的,因为可注入的是$get函数的返回值,而不是提供者本身。谢谢你的清楚解释。这些API文档现在将更有意义!
    app.config(function(dataServiceProvider, DB_CONFIG) {
         dataServiceProvider.init(DB_CONFIG);
    });