AngularJS提供商有两种不同的配方

时间:2014-11-20 18:50:09

标签: angularjs

在阅读AngularJs提供者时,我注意到不同的作者使用不同的描述来描述AngularJS提供者是什么。

这些不同的用于定义"提供商"引起了很大的困惑。

我已经在这个plnkr中找到了两种不同的方法:

http://plnkr.co/edit/ZelQLtRiibH1NqetSTqe?p=info

此外,同样如下:

app.provider('provider1', function(){

  this.$get = function(){
    return "value from provider1";
  }

});

app.provider('provider2', function(){

  return {
    $get: function() {
      return "value from provider2";
    }
  }

});

正如您将注意到的那样,在" provider1"中,我传递了一个看似构造函数的东西。 在" provider2"中,我只返回一个对象。

有人可以帮助澄清这里发生了什么吗?

2 个答案:

答案 0 :(得分:0)

经过两天筛选AngularJS源代码后,我终于找到了解决方案。这不是一件容易的事,也不是一件明显的事。为了了解原因,我们必须很好地了解框架的源代码。

注册提供程序时,您可以选择使用$ this属性或使用$ this方法构造函数。 Angular将以不同的方式处理。

提供者构造函数在注册时就会被实例化。因此,如果它有任何尚未注册的依赖项,则此方法将失败。

如果是提供者对象,这不是必须的,因为$ get是懒惰地执行的。

这些不是可互换的方法,并且都有自己的用例。

答案 1 :(得分:0)

基于documentation,您可以直接提供提供者实例(您的问题不关心此问题)或为提供者提供构造函数(两个示例都这样做)。

由于how constructor functions operate in JavaScript,你的两个例子的结果基本相同(注意以&#34开头的段落;构造函数返回的对象成为整个{{{ 1}}表达。" )。

在第一个示例中,方法被分配给默认实例对象,然后该实例对象成为实例,因为构造函数不返回任何值。在第二个示例中,构造函数返回一个包含方法的对象,然后该方法成为实例。