2013-06-18 4 views
0

Я объявляю метод объекта в javascript. Внутри этого метода я хочу выполнить вызов ajax и, когда вызов будет выполнен, изменить некоторые атрибуты этого объекта.Передача ссылки объекта внутри другого объекта

Bubble.prototype.draw = function(){ 

console.log(this.attribute) // -> works fine 

var req = $.ajax({ 
url: "someFile.php", 
type: "post", 
data: someData 
}); 

// handle response 
req.done(function (response, textStatus, jqXHR){ 

console.log(this.attribute) // -> not in the scope, obviously 

}); 

} 

Как я могу поставить this.attribute в сферу req.done? Как я могу получить доступ ко всему объекту Bubble внутри req.done? В настоящее время все мои Bubble s находятся в массиве, поэтому я могу просто передать индекс этого массива и получить доступ к свойствам таким образом (array[i].attribute). Я думаю, что есть намного лучший способ сделать это.

+0

вы пробовали контекст: это, как вариант Ajax? Не уверен, что он работает в этом случае. –

+1

'this' необходимо сохранить в переменной где-то вне функции'. $ .ajax() '. 'var self = this;' тогда вы можете получить доступ к 'this', используя' self'. –

ответ

1

Похоже, он работает так, что кажется родным способ сделать это, используя опцию контекста:

Bubble.prototype.draw = function() { 

    console.log(this.attribute) // -> works fine 

    var req = $.ajax({ 
     url: "someFile.php", 
     type: "post", 
     data: someData, 
     context: this 
    }); 

    // handle response 
    req.done(function (response, textStatus, jqXHR) { 

     console.log(this.attribute); 

    }); 

} 
+0

это лучшее решение, принятое. Благодаря! – Saturnix

3
Bubble.prototype.draw = function() { 
    console.log(this.attribute) // -> works fine 
    var req = $.ajax({ 
     url: "someFile.php", 
     type: "post", 
     data: someData 
    }), 
     self = this; //save this object 
    // handle response 
    req.done(function (response, textStatus, jqXHR) { 
     console.log(self.attribute) //access parent this 
    }); 
} 
+0

работает отлично, спасибо! – Saturnix

3

Это происходит потому, что, когда Ajax обратного вызова вызывается контекст выполнения отличается, то есть ключевым словом this внутри точек метода обратного вызова к другому объекту, а не к нужному объекту пузыря.

Есть два решения для этого, как показано ниже

Использование $ .proxy передать контекст пользовательского выполнения обработчику обратного вызова

Bubble.prototype.draw = function(){ 

    console.log(this.attribute) // -> works fine 

    var req = $.ajax({ 
     url: "someFile.php", 
     type: "post", 
     data: someData 
    }); 

    // handle response 
    req.done($.proxy(function (response, textStatus, jqXHR){ 

     console.log(this.attribute) // -> not in the scope, obviously 

    }, this)); 

} 

Или использовать замыкание переменной

Bubble.prototype.draw = function(){ 

    console.log(this.attribute) // -> works fine 

    var req = $.ajax({ 
     url: "someFile.php", 
     type: "post", 
     data: someData 
    }); 

    var _this = this; 
    // handle response 
    req.done(function (response, textStatus, jqXHR){ 

     console.log(_this .attribute) // -> not in the scope, obviously 

    }); 

} 
1

просто скопируйте this.attribute переменной в другую переменную области видимости.

Bubble.prototype.draw = function(){ 

console.log(this.attribute) // -> works fine 
_this = this.attribute; 
var req = $.ajax({ 
url: "someFile.php", 
type: "post", 
data: someData 
}); 

// handle response 
req.done(function (response, textStatus, jqXHR){ 

console.log(_this) // -> not in the scope, obviously 

}); 

} 
+1

вы устанавливаете _this в глобальном масштабе, а не лучший способ здесь –

Смежные вопросы