#javascript #jquery
#javascript #jquery
Вопрос:
У меня есть эти классы / код Javascript:
function PageManager () {
this.digital_channels = undefined;
this.loadConfiguration = function () {
this.digital_channels = new Array ();
var self = this;
$.ajax ("path_to_server",
{
type: "post",
cache: true,
context: self,
success: function (data) {
var self = $(this);
$xmlDoc = $($.parseXML (data));
$xmlDoc.find ("channel".each (function () {
self.digital_channels.push (new DigitalChannel ($(this)));
});
}
});
}
}
function DigitalChannel ($xmlDoc) {
// Object: parse XML and construct here
}
Внутри метода успеха AJAX, var self = $(this);
это моя попытка сохранить то, что, как я думал, будет объектом класса. self.digital_channels.push (new DigitalChannel ($(this)));
предполагается создать новый объект DigitalChannel, $(this)
являющийся текущим объектом XML DOM. Я хочу, чтобы этот новый объект попал в мой массив. На этом этапе массив всегда не определен.
Кто-нибудь может объяснить, как я это делаю?
Комментарии:
1. В Javascript нет классов.
2. почему вы определяете массив как неопределенный? Поскольку это частная переменная, вы могли бы определить ее как пустой массив.
3. Общая идея заключается в том, что я хочу, чтобы оно не было определено, пока я не загружу конфигурацию, чтобы я знал, что конфигурация не загружена.
4. Javascript не называет их «классами», но это действительно то, чем они являются.
Ответ №1:
Я думаю, вам нужно удалить строку var self = $(this);
из функции успеха. self уже определен до запроса ajax и будет содержать ссылку на ваш объект PageManager. Эта ссылочная переменная также должна иметь возможность использоваться в обработчике успеха.
Комментарии:
1. Спасибо, теперь мне нужно будет исследовать «область закрытия».
Ответ №2:
Ваше смешивание и чрезмерное усложнение вещей здесь. Попробуйте следующее:
function PageManager ()
{
this.digital_channels = undefined;
this.loadConfiguration = function () {
this.digital_channels = new Array ();
//var self = this; // Remove this
$.ajax ("path_to_server",
{
type: "post",
cache: true,
context: this, // Change to `this`
success: function (data) {
var that = this; // instance of PageManager
$xmlDoc = $($.parseXML(data));
$xmlDoc.find ("channel").each (function () {
that.digital_channels.push (new DigitalChannel ($(this)));
});
}
});
}
}
Комментарии:
1. Также работает. Также спасибо вам, я подумал, что должен был сделать это сложнее, чем это было на самом деле.