javascript - 在哪里初始化 Angular 服务中的数据?

标签 javascript angularjs

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

在执行此操作时,我想要一些关于最佳实践的指导。看起来有 3 个选项。

1) 在工厂公开一个公共(public)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 block

老实说,我对 Angular 的 run block 感到困惑。据推测,此处声明的任何变量都可用于该模块上的任何工厂?这还不清楚。我可以将所有代码移到一个运行 block 中,但看不到真正的好处。

谁能在这里阐明最佳实践?

最佳答案

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

  1. 工厂
  2. 服务
  3. 提供者
  4. 值(value)
  5. 不变

为了设置您的服务以便它可以在您的配置 block 中注入(inject)和初始化,您应该实现一个“提供者”。

例子:

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 设置为常量(否则,它无法注入(inject)到您的配置 block 中):

app.constant('DB_CONFIG', {
    ...
});

然后在您的配置 block 中,注入(inject)提供程序,并使用 DB_CONFIG 对其进行配置:

app.config(function(dataServiceProvider, DB_CONFIG) {
     dataServiceProvider.init(DB_CONFIG);
});

关于javascript - 在哪里初始化 Angular 服务中的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28187959/

相关文章:

javascript - 算术运算的左侧必须是类型 'any' 、 'number' 或枚举类型。无法将 Number 声明为数字

javascript - UTC( Elasticsearch )到 MomentJs 本地时间

javascript - 从另一个组件调用引用(?)

javascript - 如何在 AngularJs 中存储用户数据

javascript - 无法从 angularjs 应用程序调用 Web 服务

javascript - 带有标签的 ui-router url 参数

javascript - 一段时间后(比如100毫秒)自动调用JS函数

javascript - 完整的下拉菜单 OnClick

javascript - 从对象数组中计算特定键值

angularjs - $document 和 $window 有什么区别?