AngularJS提供程序功能

时间:2015-05-25 21:21:14

标签: javascript angularjs

function provider(name, provider_) {
  assertNotHasOwnProperty(name, 'service');
  if (isFunction(provider_) || isArray(provider_)) {
    provider_ = providerInjector.instantiate(provider_);
  }
  if (!provider_.$get) {
    throw $injectorMinErr('pget', "Provider '{0}' must define $get factory method.", name);
  }
  return providerCache[name + providerSuffix] = provider_;
}

https://github.com/angular/angular.js/blob/master/src/auto/injector.js#L655-680

我实际上在查看injector.js的provider函数,似乎所有服务[constant, value, factory, service and provider itself]都只是提供程序的包装器。

任何人都可以帮助我理解这些问题:

  1. 为什么所有这些都是wrapper的{​​{1}}?让我的provider命名为" factory/service",为什么我会将其传递给Shane以创建" {{ 1}}"对象
  2. 为什么会有provider呢?

1 个答案:

答案 0 :(得分:2)

工厂,服务和其他人对提供商来说是一个非常有用的包装器。提供者请求编写如此多的代码:

 angular.module('app', []).provider('myProvider', function(/*here you can inject another providers*/) {
     // this function can be called by another providers
     this.config = function() {}; 
     this.$get = function(/*here you can inject services*/) {
          // exprort your service value
          return {};
     };
 });

这就是提供商的工作方式:

  1. 首先,提供商可以通过调用上述示例中的方法相互交互。
  2. 然后从所有提供程序调用所有$get方法。此函数接受其他服务作为参数,因此您可以在此处与某些服务进行交互。
  3. $get方法的结果是您的服务的实际值,可以注入其他服务,控制器等。
  4. 如果您的服务不需要所有这些功能,您可以跳过一些第一步并从任何进一步开始。如果您不需要与提供商合作,请使用factory。如果您甚至不需要使用服务,请使用service(通常用于js构造函数)或value如果您的服务实际上是静态值且不需要额外准备。

    查看$provide文档,了解所有这些注册函数的确切API。

相关问题