dojo dijit. Ошибка уничтожения подложки - PullRequest
2 голосов
/ 13 марта 2011

У меня есть класс, который расширяет dijit.Dialog, но только для установки функциональности по умолчанию и кнопок для моего сайта.При нажатии кнопки отмены диалога запускается следующий код:

    this.actionDialog.destroyRecursive();
    this.actionDialog.destroy();

nb this.actionDialog = dijit.Dialog

Иногда (не всегда) выдается следующая ошибка:

Uncaught TypeError: Cannot call method 'destroy' of undefined
DialogUnderlay.xd.js:8

Что приводит к неправильному отображению следующих диалогов.Я использую 1,5 от Google API.Я что-то упустил с кодом подложки?

Ошибка, выданная после ответа Кена:

exception in animation handler for: onEnd
TypeError: Cannot read property 'style' of null

Обе из dojo.xd.js:14.Но код все еще работает правильно.

Ответы [ 4 ]

5 голосов
/ 13 марта 2011

Я до сих пор не совсем уверен, в чем проблема, кроме как по какой-то причине dijit.DialogUnderlay код запутывается.Кстати, этого не происходит в Dojo 1.6.

Пока я пытался найти некоторые потенциальные решения, мне показалось, что я случайно обнаружил, что избежать этой проблемы, возможно, так же просто, как вызвать hide() в диалоговом окне непосредственно передуничтожить его, например:

this.actionDialog.hide();
this.actionDialog.destroyRecursive();

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

Вот как вы можете это сделать в Dojo 1.5 иранее (проверено 1.3 +):

dlg.connect(dlg._fadeOut, 'onEnd', function() {
    this.destroyRecursive();
});
dlg.hide();

В версии 1.6 анимация fadeOut больше не отображается в экземпляре (в любом случае, раньше она была технически закрытой), но onHide теперь срабатывает после завершения анимации(тогда как раньше он срабатывал, как только начинался).К сожалению, setTimeout необходим, чтобы обойти ошибку, возникающую из-за другого кода в ветви, вызывающего onHide, который предполагает, что что-то еще существует в экземпляре, чего не будет после того, как мы его уничтожим (см. # 12436).

dlg.connect(dlg, 'onHide', function() {
    setTimeout(function() { dlg.destroyRecursive(); }, 0);
});
dlg.hide();

См. Это в действии на JSFiddle: http://jsfiddle.net/3MNRu/1/ (исходную ошибку в вопросе см. в исходной версии ) *

2 голосов
/ 28 февраля 2012

Метод dialog.hide () возвращает Отложено , ваш код может быть более читабельным, например:

var dialog = this.actionDialog;
dialog.hide().then(function(){ dialog.destroyRecursive(); });

Будьте осторожны, чтобы не делатьэто:

this.actionDialog.hide().then(function(){ this.actionDialog.destroyRecursive(); });

В контексте тогда это имеет другое значение!

1 голос
/ 13 марта 2011

Вам нужно только вызвать destroyRecursive ()

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

http://dojotoolkit.org/api/1.3/dijit/_Widget/destroyRecursive

destroyRecursive

Уничтожить этот виджет и его потомков.Это универсальная функция «деструктор», которую все пользователи виджета должны вызывать, чтобы полностью сбросить виджет.После уничтожения виджета он удаляется из объекта менеджера.

0 голосов
/ 04 сентября 2013

Я получил ошибку IE8: 'this.focusNode.form' is null or not an object.Я обнаружил, что это было результатом dialog.hide() возврата отложенного.Я написал свой собственный _closeDialog, который устранил ошибку IE.

_closeDialog : function(cntxt){
        cntxt.popup.hide().then(
        function(){
            cntxt.popup.destroyRecursive(false);
            cntxt.popup.destroy(false);
            cntxt.destroyRecursive(false);
            cntxt.destroy(false);
        });
    },
...