我有一个AngularJS工厂方法,它设置这样的属性(特别是在getPageInformation
方法中):
function factoryMethod($http, $q) {
return function(id) {
return {
id: id,
getPageInformation: function() {
var deferred = $q.defer();
$http({
method: "post",
url: 'getInfo.php',
data: {
id: this.id
},
headers: { 'Content-Type': 'application/x-www-form-urlencoded' }
}).then(function(successResponse) {
console.log(successResponse);
deferred.resolve('Fetched');
for (var attr in successResponse.data) {
this[attr] = successResponse.data[attr];
}
}, function(errorResponse) {
console.log(errorResponse);
deferred.reject('Unable to fetch');
});
return deferred.promise;
}
}
}
}
问题不在于AngularJS,因为你可以看到我正在返回并反对(来自花括号语法),但我需要能够动态设置对象属性。我通过响应得到的相应信息循环,但它没有设置它:
for (var attr in successResponse.data) {
this[attr] = successResponse.data[attr];
}
相反,我认为问题是(当我将console.loged this
带给我整个浏览器窗口对象时),这无法引用当前实例。有没有我可以实现我正在做的事情,或者它应该如何运作,还有另一个问题?
答案 0 :(得分:1)
Javascript中this
变量的含义很痛苦。您可以尝试在线搜索血腥细节。对于这个问题,我认为足以说回调中的this
很可能不您的直觉期望。你需要创建一个真实的闭包,通常用:
return {
...
getPageInformation: function() {
var self = this; // The closed variable here
...
$http({...})
.then(function(successResponse) {
...
for (var attr in successResponse.data) {
self[attr] = successResponse.data[attr]; // Use like this
}
...