2015-05-15 78 views
1

我有路過「這個」對象的$ HTTP服務「然後」回調函數的問題「然後」回調函數如下圖所示

var Product = function(){ 
    this.name = "putty"; 
    this.price = 760; 
    $http.post(url, data).then.call(this, function(){ 
     this.saved = true; 
    }); 
}; 

當我在語句this.saved = true中檢查'this'對象,我意識到它指向全局對象而不是預期的Product實例,因爲我有「then.call(this,function(){.. 。「而不是」然後(this,function(){...「就像我的代碼中可以看到的那樣,任何幫助都可以嗎???

+2

您的問題是'.call'約束力'this'到'then',不向被傳遞的功能作爲'then'的參數。 (){this.saved = true;} .bind(this);' – DRobinson

+0

@DRobinson可能使這個答案? –

回答

5

當使用then.call(this, function(){});你調用then功能this,但不會影響您的實際回調函數的this值通過。

如果你要綁定this回調,您可以使用bind

$http.post(url, data).then(function(){ 
    this.saved = true; 
}.bind(this)); 
+0

這個''不具有回調函數的作用域嗎?而不是'Product'對象? –

+0

不,綁定將創建該產品的回調函數的副本。 – DRobinson

+0

啊,我明白了,謝謝! –

-1

指定一個var並且使用該var代替

var Product = function(){ 
    var self = this; 
    self.name = "putty"; 
    self.price = 760; 
    $http.post(url, data).then(function(response){ 
     self.saved = true; 
    }); 
}; 
-1

您需要重新分配它:

var Product = function(){ 
    this.name = "putty"; 
    this.price = 760, 
    self = this; 
    $http.post(url, data).then.call(this, function(){ 
     self.saved = true; 
    }); 
}; 
+0

@PSL刪除它,忘記從原始代碼示例中刪除它 – micahblu

+1

你們三個人都完全錯過了這個觀點,他使用'.call'是有原因的,他的困惑是爲什麼'.call'似乎沒有用他期望的正確的'this'調用函數,混淆源於'call '正在使用錯誤的函數(它正確地設置'this',但是這樣做到'then'函數,而不是他的回調函數。 – DRobinson