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

Where to initialise data in Angular service?

本文关键字:数据 位置 初始化 Angular 服务      更新时间:2023-09-26

我正在用我的第一个 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块感到困惑。大概这里声明的任何变量都可用于该模块上的任何工厂?这并不清楚。我可以将所有代码移动到运行块中,但看不到好处。

任何人都可以澄清这里的最佳实践吗?

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

  1. 服务
  2. 供应商
  3. 价值
  4. 不断

为了设置您的服务,以便可以在您的配置块中注入和初始化它,您应该实现一个"提供程序"。

例:

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