Как уничтожить виджеты пользовательского интерфейса jQuery из его прототипа

Я начал использовать Widget Factory для создания плагинов. Однако я не могу найти способ уничтожить плагин изнутри.

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

Скажем, например, плагин вызывается с неверными параметрами или некорректным элементом, или через некоторое время он не проходит проверку. Я хотел бы иметь возможность впоследствии вызвать this.destroy () и уничтожить плагин. Когда я вызываю this.destroy (), он вызывает $ .Widget.prototype.destroy () и мой последующий метод _destroy (), но экземпляр все еще находится в элементе DOM. Только при вызове $ (el) .pluginName ('destroy') он действительно уничтожается.

Быстрый пример здесь

Скажем, у нас есть HTML

<p>Lorem ipsum</p>

и наш виджет пользовательского интерфейса jQuery, который стремится уничтожить его, как только он будет создан

$.widget('ns.test', {
    _create: function() {
        this.destroy();
    },

    _destroy: function() {}
});

и мы вызываем подключение, чтобы

$('p').test();

Я ожидал, что экземпляр не будет установлен на $ ('p'), но он

$('p').data();
>> Object {ns-test: $.widget.$.(anonymous function).(anonymous function)}

Только при вызове метода из DOM он уничтожается

$('p').test('destroy');
>> Object {}

Есть какие-нибудь мысли?


person Dwayne    schedule 02.04.2015    source источник
comment
Вы можете вызвать this.destroy() из любого метода, кроме _create и _init, и он будет работать так, как вы ожидаете, но я не совсем уверен, почему. Вероятно, это как-то связано с тем, как обрабатываются .data данные   -  person blgt    schedule 02.04.2015
comment
Спасибо! Я попробовал это, и провел еще несколько тестов, но кажется, что пока виджет является «инициатором», он не будет работать. Вызов this._trigger, например, также не будет работать, если запуск не выполняется извне, например, изнутри window.setTimeout. Использование this.destroy() в другом месте не сработало, если только оно не было инициировано действием пользователя, например щелчком мыши или наведением курсора. Думаю, мне придется с этим жить. В любом случае спасибо   -  person Dwayne    schedule 02.04.2015


Ответы (1)


+ blgt insight был более-менее верным. Итак, я добавляю это и принимаю.

Вы можете вызвать this.destroy() из любого метода, кроме _create и _init, и он будет работать так, как вы ожидаете, но я не совсем уверен, почему. Вероятно, это как-то связано с тем, как обрабатываются .data данные

person Dwayne    schedule 06.04.2016