我应该如何在AngularJS中制作可配置的模块

Jos*_*lsh 11 javascript angularjs angularjs-module

我一直在修改AngularJS,我已经建立了一小部分指令和服务,我想把它打包成一个JS文件,以便我可以在任何地方使用它们.

我有一些网站特定的设置,我的模块将需要API调用等等.我只是想知道Angular制作可配置模块的方法是什么.显然,我不想为每个网站修改我的可重用JS文件,因为这样做会破坏它的目的.看到每个网站的值保持不变,将每个函数调用作为参数传递它们似乎是一件非常麻烦的事情,而且我宁愿尽可能远离全局变量.

我已经搜索了很多问题以寻找我所寻求的答案,而我到目前为止找到的最接近的模式是让我的可重用模块依赖于一个名为"settings"之类的未包含的模块,然后定义该模块.页面的JS文件,允许可重用​​模块从中提取值.这是一个展示我的意思的例子.

这似乎是我的倒退.这有点像从全局值中获取函数pull值而不是将值作为参数传递.

这真的是最好的方法吗,还是有替代方案?

Mic*_*ley 11

听起来你正在寻找提供者.

仅当您要为应用程序范围的配置公开API时才应使用Provider配方,该API必须在应用程序启动之前进行.这通常仅适用于可重用服务,其行为可能需要在应用程序之间略有不同.

这是提供者的一个非常基本的例子:

myMod.provider('greeting', function() {
  var text = 'Hello, ';

  this.setText = function(value) {
    text = value;
  };

  this.$get = function() {
    return function(name) {
      alert(text + name);
    };
  };
});
Run Code Online (Sandbox Code Playgroud)

这会创建一个新服务,就像您使用myMod.service或者一样myMod.factory,但提供了一个在配置时可用的附加API - 即一种setText方法.您可以在config块中访问提供程序:

myMod.config(function(greetingProvider) {
  greetingProvider.setText("Howdy there, ");
});
Run Code Online (Sandbox Code Playgroud)

现在,当我们注入greeting服务时,Angular将调用提供者的$get方法(在其参数中注入它要求的任何服务)并为您提供它返回的任何内容; 在这种情况下,$get返回一个函数,当使用名称调用时,将使用我们设置的任何内容警告名称setText:

myMod.run(function(greeting) {
  greeting('Ford Prefect');
});

// Alerts: "Howdy there, Ford Prefect"
Run Code Online (Sandbox Code Playgroud)

这正是其他供应商的喜欢$httpProvider$routeProvider工作方式.

有关提供程序和依赖项注入的更多信息,请查看有关依赖项注入的SO问题.