Angularjs 更新';这';Angular JS服务中$Promise内的上下文属性
我的服务中使用的功能定义如下:Angularjs 更新';这';Angular JS服务中$Promise内的上下文属性,angularjs,Angularjs,我的服务中使用的功能定义如下: var getData = function() { return anotherService.getData().$promise; }; 以及我在整个服务过程中操作的这个属性 this.someProperty = 'a string'; 我在我的服务的返回部分调用上述函数: return{ updateProperty: function(){ getData().then(function(data){
var getData = function() {
return anotherService.getData().$promise;
};
以及我在整个服务过程中操作的这个
属性
this.someProperty = 'a string';
我在我的服务的返回部分调用上述函数:
return{
updateProperty: function(){
getData().then(function(data){
this.someProperty = data;
});
}
}
在上面,我在我的浏览器控制台中得到了一个
未定义的相关错误。我假设这是因为解析的$promise
是一个AJAX调用,而这个
是在上下文之外使用的。在本例中,使用AJAX调用返回的数据操作this
属性的最佳方法是什么?如果您在整个服务过程中操作this
,请将其分配给变量,如var self=this
。问题在于,此
是函数的上下文,可以由其他代码使用fn.call(context)
或fn.apply(context,args)
进行更改。因此,在任何给定函数的范围内,它都可能是不同的
因此,只需将其分配给某个变量并使用它:
var self=this;
返回{
updateProperty:function(){
getData().then(函数(数据){
self.someProperty=数据;
});
}
};
最简单的方法是使用该函数。此函数为函数调用设置“This”上下文。因此,在您的情况下,您必须使用它两次,以便适当的“this”在中填充
return{
updateProperty: function(){
getData().then((function(data){
this.someProperty = data;
}).bind(this));
}
}
这是为了确保传递给promise的处理程序使用原始的“This”(传递给updateProperty)执行。现在,要将正确的“this”值传递给updateProperty函数,您应该在控制器中执行以下操作:
(myService.updateProperty.bind(this))();
绑定有很多版本,包括绑定整个服务。此外,还可以查看lodash的函数扩展
我准备了一份报告来证明这一点。它涵盖了我上面列出的内容,以及另一个需要注意的重要事项。当您使用setTimeout时,处理程序在全局上下文(在本例中为“窗口”)中调用,这就是为什么我添加了第三个绑定,以确保“this”在超时处理程序中是相关的。我还添加了各种计数增量调用,以证明“this”在整个过程中是相同的值
如果这是一个重复的场景,您可能希望传递目标对象(然后使用处理程序只是为了知道它已更新),或者传递处理程序(也需要绑定)。我还为这些场景添加了示例
最后一句话,call、apply和bind是javascript的关键,值得学习。花点时间在这上面,努力走出地狱