вызов jQuery .remove () для пользовательского интерфейса виджета вызывает бесконечный цикл - PullRequest
1 голос
/ 26 марта 2012

Я создал пользовательский виджет пользовательского интерфейса jQuery под названием uiPopover, очень похожий на UI-диалог (на самом деле большая часть кода скопирована с него). Этот виджет имеет собственный метод уничтожения, который скрывает виджет и удаляет его из DOM. Опять же, это в значительной степени копирование-вставка из UI-диалога.

    destroy: function() {
        var self = this;

        if (self.overlay) {
            self.overlay.destroy();
        }
        self.close();
        self.element
            .removeData('popover');
        self.uiPopover.remove();
        console.log('afterRemove')

        return self;
    },

Странно то, что это вызывает бесконечный цикл, который выдает некоторые ошибки:

$('#element').popover();
$('#element').remove();

Насколько я вижу, проблема в том, что когда я вызываю .remove (), он автоматически вызывает destroy () для моего виджета (это встроено в пользовательский интерфейс jQuery), а метод destroy пытается вызвать remove ( ) снова на моем элементе, а затем снова пытается вызвать destroy () и т. д.

Однако странная вещь заключается в том, что этого не происходит с диалогом пользовательского интерфейса. Поэтому, когда я делаю это:

$('#element').dialog();
$('#element').remove();

Все в порядке ... Должно быть, что-то не так с моим плагином, но я не могу понять, что.

Вот полный источник моего плагина: https://gist.github.com/2208569

1 Ответ

1 голос
/ 26 марта 2012

Вы ничего не можете сделать с рекурсивным вызовом destroy(), кроме изменения самого пользовательского интерфейса jQuery.Однако вы можете разорвать цепочку, предотвратив повторный вызов remove():

destroy: function() {
    var self = this;

    if (self.overlay) {
        self.overlay.destroy();
    }
    self.close();

    if (self.element.data("popover")) {
        self.element.removeData("popover");
        self.uiPopover.remove();
    }

    return self;
}

Попутно заметьте, что вам не нужно копировать и вставлять код для расширения существующих виджетов, так какКаркас виджета поддерживает наследование прототипа .Было бы интересно узнать, если ваша проблема все еще возникает, если ваш виджет получен из $.ui.dialog вместо дублирования его кодовой базы.

...