Как связать объект-контейнер предка с элементом управления ExtJS?

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

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

Мой вопрос: как я могу получить ссылку на родительское окно моей кнопки БЕЗ ссылки на окно по id? Я буквально хочу ссылку на экземпляр Ext.Window, а не экземпляр Ext.Panel, содержащий мою кнопку.

Примечание. Я не хочу ссылаться на окно по id, потому что я подклассифицирую класс Ext.Window, и поэтому идентификатор окна не всегда будет одинаковым. Короче говоря, я создаю класс мастера, и когда я нажимаю кнопку "Отмена мастера", я хочу скрыть окно мастера, содержащее кнопку.

Вот мой код:

var newWizardWindow = new WizardWindow({
  id: 'newWizardWindow',
  title: 'New',
  items: [
    ...
  ],   
  buttons: [{
    text: 'Cancel',
    handler: function() {
      // REFERENCE WizardWindow instance here.
    }
  },{
    id: 'newWizardPreviousButton',
    text: '« Previous',
    disabled: true,
    handler: newWizardNavigator.createDelegate(this, [-1])
  },{
    id: 'newWizardNextButton',
    text: 'Next »',
    handler: newWizardNavigator.createDelegate(this, [1])
  }],
  listeners: {
    …
  }
});

Вот некоторые идеи, которые я придумал, как скрыть окно:

  • this.ownerCt.ownerCt(это кнопка). Неблагоприятно, как с будущим обновлением ExtJS, число родителей между окном и кнопкой может измениться.
  • Как-то сохранить ссылку на экземпляр WizardWindow в классе WizardWindow.
  • Найдите ближайший класс WizardWindow [CSS] в режиме jQuery: $(this).closest('. wizardWindow'). Может быть, this.findByParentType('WizardWindow')?

Ответ 1

Как пробовать метод findParentByType(...)? Я помню, как его использовали несколько раз.

findParentByType ( String/Ext.Component/Class xtype, [Boolean shallow]): Ext.Container

Найдите контейнер над этим компонентом на любом уровне по типу или классу.

Здесь вы можете использовать xtype вместо id в качестве ссылки, а xtype - то же самое независимо от того, какой экземпляр у вас есть.

buttons: [{
    text: 'Cancel',
    handler: function() {
        // REFERENCE WizardWindow instance here.
        var parentWindow = this.findParentByType('xtypelizardwindow');
    }
}]

Ответ 2

Вы можете передать ref как область действия.

buttons: [{
    text: 'Cancel',
    scope:this,
    handler: function() {
    }
}]

Ответ 3

В вашей конфигурации для вашей кнопки, как родственного свойства вашего обработчика, вы можете добавить область: свойство newWizardWindow? Я не уверен на 100%, если это сработает, но я думаю, что так будет. Это задает область вашего обработчика кнопок как окно, а внутри функции обработчика вы можете просто сделать this.hide();

Ответ 4

this.ownerCt также дает ссылку на родительский объект, который является контейнером. поскольку он использует this.findParentByType(parent xtype)