Уничтожая окно - PullRequest
       24

Уничтожая окно

1 голос
/ 23 февраля 2012

Я использую ExtJs4.

new Ext.Window({
    id: token + '_window',
    animateTarget: token + '_taskbar',  //Button id
    height: 300,
    width: 300,
    title: name,
    maximizable: true,
    minimizable: true,
    iconCls: 'basketball-small-icon',
    html: 'This is the <b>' + name + '</b> window',
    listeners: {
        'beforeclose': onWindowClose,
        'minimize': function(){ this.hide(); }
    }

Обратите внимание на кнопку, с которой связана анимированная цель.Здесь onWindowClose определяется как

function onWindowClose(t){
var token = t.id.split('_')[0];
var taskBarItemId = token + '_taskbar';

Ext.getCmp(taskBarItemId).destroy(); //Destroying the button
t.destroy();  //Destroying the window
}

Здесь я хочу удалить окно и связанную кнопку.Каждый раз, когда я закрываю окно, у меня есть два варианта:

  • . Я могу уничтожить как кнопку, так и окно, но иногда я не могу открыть окно снова.Я думаю, что это как-то связано с тем, что кнопка связана с окном animateTarget.Потому что, когда я удаляю это свойство, это прекрасно работает.
  • Я могу использовать t.close () вместо t.destroy (), но оно становится рекурсивным.Как я могу вызвать метод закрытия базы?

Является ли хорошей идеей уничтожать окно каждый раз и создавать с использованием 'new' всякий раз, когда нажимается значок?В чем разница между методами close () и destroy ()?

Ответы [ 2 ]

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

Если я хорошо понимаю, вы хотите повторно использовать окно с другим контентом.Таким образом, вы должны создать только одно окно, которое вы будете использовать повторно, обновляя html-контент и вызывая show () в этом окне.Для этого вам необходимо добавить свойство closeAction:'hide'.Таким образом, ваше окно не будет уничтожено при нажатии на кнопку закрытия.

test = new Ext.Window({
    id: token + '_window',
    animateTarget: token + '_taskbar',
    height: 300,
    width: 300,
    title: name,
    maximizable: true,
    minimizable: true,
    closeAction: 'hide',
    iconCls: 'basketball-small-icon',
    html: 'This is the <b> imad </b> window',
    listeners:{
        'beforehide':function(win){
            Ext.getCmp(win.animateTarget).hide();
        }
    }
});

Затем вы добавите этот слушатель к своим кнопкам:

    listeners:{
        'click':function(){
            var token = t.id.split('_')[0];
            var targetWindow = Ext.getCmp('token + '_window);
            targetWindow.body.dom.innerHtml = 'Your new html !';
            targetWindow.show();
        }
    }
0 голосов
/ 23 февраля 2012

Вам не нужно вызывать destroy (), так как после закрытия окна оно автоматически уничтожается.
См. API Ext.Window .
И не вызывайте close () в вашем обработчике beforeclose, поскольку он уже собирается закрываться.

Я думаю, что вы можете использовать 'new' всякий раз, когда вы хотите создать окно и закрыть его, либо щелкнуть инструмент закрытия заголовка (вверху справа), либо вызвать его метод close (). Не беспокойся об уничтожении. Ext сделает это.

Основное различие между close () и destroy () заключается в том, что close 'fires' закрывает события и решает, закрывать ли окно или скрывать его, основываясь на параметре конфигурации closeAction. Если он решит закрыть, будет вызван destroy ().

EDIT: попробуйте следующее

function onWindowClose(t){
    var token = t.id.split('_')[0];
    var taskBarItemId = token + '_taskbar';

    Ext.getCmp(taskBarItemId).destroy(); //Destroying the button
    //t.destroy();  //Remove this statement.
    return true;
}

РЕДАКТИРОВАТЬ 2: Удалить свернуть слушателя

listeners: {
    'beforeclose': onWindowClose//,
     //'minimize': function(){ this.hide(); }
}
...