在不同模块中具有不同配置的Angularjs提供程序

Luc*_*rea 3 angularjs angularjs-provider

我想知道是否有一种方法可以使提供程序的配置在整个应用程序中唯一,而不是在整个应用程序模块中唯一。

例如,我有一个模块“ core”,其中包含提供程序的定义。然后,我有了模块“ module1”和“ module2”,它们使用提供程序,但必须针对特定模块以特定方式对其进行配置。

我正在发生的事情是,在最后定义的模块中完成的配置将覆盖在应用程序中使用提供程序的所有其他模块中完成的配置。

我做了一个简单的例子来说明这一点:

var app = angular.module('app', ['module1','module2']);

angular.module('core',[])

.provider('movie', function () {
  var version;
  return {
    setVersion: function (value) {
      version = value;
    },
    $get: function () {
      return {
          title: 'The Matrix' + ' ' + version
      }
    }
  }
});

angular.module('module1',['core'])

.config(function (movieProvider) {
  movieProvider.setVersion('Reloaded');
})

.controller('ctrl1', function ($scope,movie) {
  $scope.title = movie.title;
  $scope.module = 'module1';
});


angular.module('module2',['core'])

.config(function (movieProvider) {
  movieProvider.setVersion('Revolutions');
})

.controller('ctrl2', function ($scope,movie) {
  $scope.title = movie.title;
  $scope.module = 'module2';
});
Run Code Online (Sandbox Code Playgroud)

http://plnkr.co/edit/BI5nhmcdgzQZfZo56Koh?p=preview

小智 5

理论和其他无用的废话

在角度提供程序中,$ get旨在返回所提供功能的单个实例。$ get()在提供程序的每个实例(例如工厂)上重新执行。提供提供者定义的功能或对象仅实例化一次(如服务)。

因此,要从提供程序中获取类似工厂的属性,您希望将实例特定的属性的范围限制在$ get内;并获得$ get之外的类服务属性。

乍一看,这似乎有些局限或round回,但它允许您以非常漂亮的方式组合实例范围的属性和全局范围的属性。

你的问题,特别是

具体来说,对于您的问题,如果我们只是var version进入$get,我们突然会得到您想要的类似于工厂的行为:

.provider('movie', function () {
  return {
    $get: function () {
      var version;

      var obj = {
          title: function() { return 'The Matrix' + ' ' + version; },
          setVersion: function (value) {
            version = value;
          }
      };

      return obj;
    }
  }
});
Run Code Online (Sandbox Code Playgroud)

http://plnkr.co/edit/0m9qKzNuhCOOXTbrCQ1T?p=preview

更改范围(将标题更改为变量的函数,而不是在创建obj时静态生成的字符串),可以得到所需的输出:

This is module module1

Title: The Matrix Reloaded

This is module module2

Title: The Matrix Revolutions
Run Code Online (Sandbox Code Playgroud)

这基本上就像工厂的ATM。

提供商真正脱颖而出的地方

为了进入提供者的更正常的用例(我们要结合全局范围和每个实例的作用域),假设我们想要一个API提供者,该提供者可以在不同的人的应用程序中使用几种不同的API之一-但是每个应用程序只有一个API。我们希望我们的提供商看起来像这样-

.provider('movie', function () {
  var imdbEndpoint;

  return {
    setApiEndpoint: function(newImdbEndpoint) {
      imdbEndpoint = newImdbEndpoint;
    },
    $get: function () {
      var version;

      var obj = {
          title: function() { return imdbEndpoint + ' says the The Matrix version is ' + ' ' + version; },
          setVersion: function (value) {
            version = value;
          }
      };

      return obj;
    }
  }
});
Run Code Online (Sandbox Code Playgroud)

http://plnkr.co/edit/ZoSgQDpNdX8MOmet7xzM?p=preview

输出:这是模块module1

Title: api.imdb.com says the The Matrix version is Reloaded

This is module module2

Title: api.imdb.com says the The Matrix version is Revolutions
Run Code Online (Sandbox Code Playgroud)

因此,现在我们的API端点URL在全球范围内(或在每个应用程序的基础上),但是我们可以引用我们想要的任何电影,而不会对Neo处于矩阵的哪一层感到困惑-因为那才是真正的意思,对吗?