在Angular服务中初始化数据的位置?

时间:2015-01-28 08:47:20

标签: javascript angularjs

我找到了第一个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块感到困惑。据推测,此处声明的任何变量都可以在该模块上的任何工厂使用?目前尚不清楚。我可以将所有代码移动到运行块中,但无法真正看到好处。

有人可以澄清这里的最佳做法吗?

1 个答案:

答案 0 :(得分:4)

初始化服务的最佳位置是配置块 - 这就是它们的用途。有5种服务:

  1. 服务
  2. 提供商
  3. 为了设置您的服务以便在配置块中注入和初始化,您应该实现“提供者”。

    示例:

    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);
    });