在我的Angular模块中,我有一个像这样的服务:
myApp.service( 'myService', function(){
this.publicFunction1 = function(){
...
};
this.publicfunction2 = function(){
...
};
function privateFunction(){
...
}
});
在某一点上,我需要从私人中调用一个“公共”功能,如下所示:
function somePrivateFunc(){
this.publicFunction1();
...
}
但是'this'元素似乎在私有函数中不可见。我怎么能在里面调用publicFunction1()?
这是一个解决方法,但我想明白这种情况。有人能解释一下这里发生了什么吗?还有更好的方法吗?
myApp.service( 'myService', function(){
var service = this;
this.publicFunction1 = function(){
...
};
this.publicfunction2 = function(){
...
};
function privateFunction(){
service.publicFunction1();
...
}
});
答案 0 :(得分:5)
保留this
的参考
变量在外面,并在任何地方引用如下:
myApp.service('myService', function() {
var self = this;
this.publicFunction1 = function() {
...
};
this.publicfunction2 = function() {
...
};
function privateFunction() {
...
}
function somePrivateFunc() {
self.publicFunction1();
...
}
});
由于public函数是服务的一部分,而角度服务的执行上下文只是this
关键字。但是,由于私有函数(普通javascript函数)不是服务的一部分,因此该函数不共享相同的执行上下文。因此,对于该私有函数,执行上下文只是全局window
对象。因此,如果您在私有函数内部引用this
,您将获得window
对象。因此,要从普通的javascript函数(私有函数)调用服务函数,我们需要存储角this
对象的引用。
希望这清楚你的怀疑。
答案 1 :(得分:3)
您可以在以下变量中为此创建引用:
myApp.service( 'myService', function(){
var self = this; // creation of the variable here
this.publicFunction1 = function(){
...
};
this.publicfunction2 = function(){
...
};
function privateFunction(){
self.publicFunction1();
...
}
});
编辑:解释为什么有必要,Angular是在依赖注入的基础上完成的(在这里阅读:https://docs.angularjs.org/guide/di)。例如,您将在控制器中添加“myService”作为依赖项,您将可以访问从“myService”定义创建的对象。
然后您就可以调用this.publicFunction1()。
另一方面,如果不添加此方法,则控制器中不存在此方法。
答案 2 :(得分:0)
在函数外部,声明一个如下变量:
var me = this;
然后你可以在函数中引用'外部'this
。