在阅读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"中,我只返回一个对象。
有人可以帮助澄清这里发生了什么吗?
答案 0 :(得分:0)
经过两天筛选AngularJS源代码后,我终于找到了解决方案。这不是一件容易的事,也不是一件明显的事。为了了解原因,我们必须很好地了解框架的源代码。
注册提供程序时,您可以选择使用$ this属性或使用$ this方法构造函数。 Angular将以不同的方式处理。
提供者构造函数在注册时就会被实例化。因此,如果它有任何尚未注册的依赖项,则此方法将失败。
如果是提供者对象,这不是必须的,因为$ get是懒惰地执行的。
这些不是可互换的方法,并且都有自己的用例。
答案 1 :(得分:0)
基于documentation,您可以直接提供提供者实例(您的问题不关心此问题)或为提供者提供构造函数(两个示例都这样做)。
由于how constructor functions operate in JavaScript,你的两个例子的结果基本相同(注意以&#34开头的段落;构造函数返回的对象成为整个{{{ 1}}表达。" )。
在第一个示例中,方法被分配给默认实例对象,然后该实例对象成为实例,因为构造函数不返回任何值。在第二个示例中,构造函数返回一个包含方法的对象,然后该方法成为实例。