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

时间:2014-05-12 02:09:01

标签: javascript angularjs angularjs-module

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

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

我已经针对我寻求的答案搜索了很多问题,而我迄今发现的最接近的模式是让我的可重用模块依赖于一个名为"设置& #34;或者其他什么,然后在页面的JS文件中定义该模块,允许可重用​​模块从中提取值。 Here's an example to show what I mean.

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

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

1 个答案:

答案 0 :(得分:11)

听起来你正在寻找a provider

  

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

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

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

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

  this.$get = function() {
    return function(name) {
      alert(text + name);
    };
  };
});

这会创建一项新服务,就像您使用myMod.servicemyMod.factory一样,但会提供配置时可用的其他API,即setText方法。您可以在config块中访问提供商:

myMod.config(function(greetingProvider) {
  greetingProvider.setText("Howdy there, ");
});

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

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

// Alerts: "Howdy there, Ford Prefect"

这正是其他提供商(如$httpProvider$routeProvider)的工作方式。

有关提供程序和依赖项注入的更多信息,请查看this SO question on dependency injection