在Angular服务中,数据应该在哪里初始化?

4

我正在通过我的第一个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块感到困惑。据推测,在此处声明的任何变量都将对该模块上的任何工厂可用?这并不清楚。我可以将所有代码移动到一个run块中,但是真的看不出有什么好处。

有人能澄清这里的最佳实践吗?


我会使用2。为什么必须是IIFE块? - Peter Ashwell
1
你应该查看创建Angular服务的“provider”配方。它可以在“config”阶段进行一些初始化。 - Chandermani
@PeterAshwell 昨晚我在玩这个时,由于阅读 Angular API 文档时对触发顺序的误解,使用了 IIFE。认为即使在 .config 和 .run 块被触发之前也会可用...我的错误。 - cortexlock
1个回答

4

最佳的服务初始化位置是config block - 这就是它们的用途。有5种类型的服务:

  1. 工厂(Factory)
  2. 服务(Service)
  3. 提供者(Provider)
  4. 值(Value)
  5. 常量(Constant)

为了设置您的服务,使其可以被注入和初始化在config block中,您应该实现一个 "提供者(Provider)"。

示例:

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

谢谢...不过我还是不太清楚。我的理解是factoryprovider的一个便捷包装器,这个对吗?如果是这样的话,上面的模式给我的好处与我示例中的代码(我在那里使用了.constant块)有什么不同呢?是因为provider可以注入到config块中而factory不能吗?对此的一些澄清将非常有帮助。您仍然公开了一个公共的init方法,然后在主应用程序模块中触发它...这是否是Angular的正确做法? - cortexlock
你是正确的 - 工厂不能被注入到配置块中。提供者允许您在服务被缓存和注入到控制器函数之前进行配置。主要优点是清晰度和可测试性。不,init从服务中没有公开暴露,因为可注入的是$get函数的返回值,而不是提供者本身。 - pixelbits
谢谢您清晰的解释。现在那些API文档会更有意义了! - cortexlock

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接