11

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

我有一些特定于网站的设置,我的模块将需要这些设置来进行 API 调用等。我只是想知道制作可配置模块的 Angular 方法是什么。显然,我不想为每个网站修改我的可重用 JS 文件,因为这违背了拥有它的目的。鉴于每个网站的值将保持不变,将它们作为每个函数调用的参数传递似乎非常麻烦,我宁愿尽可能远离全局变量。

我已经搜索了很多问题来寻找我想要的答案,到目前为止我发现的最接近的模式是让我的可重用模块依赖于一个名为“设置”或其他东西的未包含模块,然后在页面的 JS 文件,允许可重用​​模块从中提取值。这是一个例子来说明我的意思。

这对我来说似乎倒退了。这有点像让函数从全局值中提取值,而不是将值作为参数传递。

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

4

1 回答 1

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

这将创建一个新服务,就像您可能使用myMod.serviceor一样myMod.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工作的方式。

有关提供程序和依赖注入的更多信息,请查看关于依赖注入的 SO question

于 2014-05-12T02:20:37.597 回答