jQuery Ajax с классами

#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. Также работает. Также спасибо вам, я подумал, что должен был сделать это сложнее, чем это было на самом деле.