2012-09-21 19 views
7

Mam "tabpanel" - to "główna" forma (widok). W tym "tabpanelu" definiuję różne zakładki - xtype "panel". Mam więc jeden widok "główny" (kontroler), "główny" i kilka widoków kart. Widoki kart są przywoływane w widoku głównym.Definiowanie słuchaczy w kontrolerze ExtJS

Chcę zdefiniować odsłuchiwanie zdarzenia "aktywuj" w panelu dziecka w kontrolerze głównym. Jak mogę to zrobić?

Określenie 'główny' Kontroler:

Ext.define('KP.controller.account.apartment.Main', { 
    extend: 'Ext.app.Controller', 

    views: ['account.apartment.Main', 
     'account.apartment.Requisites' 
    ], 

    models: ['account.apartment.Requisites' 
    ], 
    stores: ['account.apartment.Requisites' 
    ], 


    init: function() { 

    } 
}); 

Określenie 'główny' Wyświetl:

Ext.define('KP.view.account.apartment.Main', { 
    extend: 'Ext.window.Window', 
    alias: 'widget.ApartmentData', 

    height: 566, 
    width: 950, 
    activeItem: 0, 
    layout: { 
     type: 'fit' 
    }, 
    autoShow: false, 

    initComponent: function() { 
     var me = this; 

     Ext.applyIf(me, {    
      items: [ 
       { 
        xtype: 'tabpanel', 
        activeTab: 0, 
        deferredRender: true, 

        items: [       

         { 
          xtype: 'RequisitesApartment' 
         } 
        ] 
       } 
      ] 
     }); 

     me.callParent(arguments); 
    } 

}); 

Panel dziecko RequisitesApartment (Wygląd):

Ext.define('KP.view.account.apartment.Requisites', { 
    extend: 'Ext.panel.Panel', 
    alias: 'widget.RequisitesApartment', 


    id: 'panel_accountrequisites', 
    height: 350, 
    width: 1124, 
    autoScroll: true, 
    layout: { 
     type: 'fit' 
    }, 


    listeners: { 
     activate: function() {   
       ....load data.... 
       ...this listeners I want to push in 'main' controller...    
     } 
    }, 

    initComponent: function() { 
     var me = this; 

     var grid_store = Ext.create('KP.store.account.apartment.Requisites'); 

     Ext.applyIf(me, { 
      dockedItems: [ 
       { 
        xtype: 'gridpanel', 
        height: 260, 
        autoScroll: true, 
        dock: 'bottom', 
        store: grid_store, 
        id: 'r_gridFlatParams', 
        forceFit: true, 


        columns: [ 
         ...some columns.... 
        ], 
        viewConfig: { 
       } 
      } 
      ] 
     }); 

     me.callParent(arguments); 
    } 
}); 

Odpowiedz

3

Cóż, należy umieścić ten kod w 'głównym' (Controller):

this.control({ 
     'ApartmentData tabpanel RequisitesApartment': { 
      activate: function() { 
       console.log('hello!');     
      } 
     } 
    }); 

Problem był w złym selektor, że użyłem. Prawidłowe selektor jest:

'ApartmentData tabpanel RequisitesApartment' 

Tam ApartmentData "(określenie jak alias: 'widget.ApartmentData') - stanowi 'okno' xtype -W głównego formularza. tabpanel - panel z zakładkami w 'oknie' i 'apartServList' (zdefiniuj jak alias: 'widget.RequisitesApartment') - niektóre panele.

Dzięki za sra!

+2

Dobrze, 'apartServList' nie można znaleźć w przykładowym kodem Więc ja t będzie nieco trudny do śledzenia dla innych, dlaczego jest to poprawna odpowiedź. Ja włączyłem. Może mógłbyś edytować swoje pytanie. – sra

+0

Należy pamiętać, że mój przykład wskazuje na przycisk tabulatora, a nie na kartę. O ile wiem, zdarzenie aktywujące zakładki nie jest przepuszczane przez panel, czyż nie? – sra

+0

Edytowałem swoją odpowiedź, w 'panelu' xtype ma wydarzenie "aktywuj". – Oleg

7

zarejestrować się bezpośrednio control w ramach odpowiedzialnego kontrolera

Oto przykład z działającym zapytaniem. Na pewno wystarczy zapytanie, ale uważam, że jest to dobry przykład. Niestandardowy identyfikator właściwości cfg ułatwia znalezienie każdej karty. Tak jak w poniższym przykładzie, będziesz musiał określić tabConfig w każdym panelu i zdefiniować tam identyfikator.

Ext.create('Ext.tab.Panel', { 
    width: 400, 
    height: 400, 
    renderTo: document.body, 
    items: [{ 
     title: 'Foo', 
     tabConfig: { 
      ident: 'foo' 
     }, 
    }, { 
     title: 'Bar', 
     tabConfig: { 
      ident: 'bar', 
      title: 'Custom Title', 
      tooltip: 'A button tooltip' 
     } 
    }] 
}); 

console.log(Ext.ComponentQuery.query('tabpanel tabbar tab[ident=foo]')[0]); 
console.log(Ext.ComponentQuery.query('tabpanel tabbar tab[ident=bar]')[0]); 

Innym sposobem jest użycie css identyfikatorów, które można przeszukiwać jak '#my-name' ale polecam użyć niestandardowego jednej, jak w powyższym przykładzie

+0

@Rezygnacja z pracy zakończona. W tym przykładzie masz bezpośredni dostęp do każdej zakładki – sra

+0

W "głównym" (kontroler) napiszę: to.kontrola ({ 'zakładka umieszczenie zakładek ApartmentData tabpanel [ident = foo]': { Włączanie: funkcję (ruszt) { console.log ('parampampam'); } } }); - Ale to nie jest praca ( – Oleg

+0

@Oleg First, należy pisać widżety małymi literami i tylko nazwy klas w camelcase.Po drugie, czy zastosowałeś tabConfig wraz z 'xtype: 'RequisitesApartment''? Powyższy przykład można skopiować w jeden . pól przykład kodu wewnątrz Sencha API – sra

0

poprawną rzeczą do zrobienia jest, aby przekazać obiekt konfiguracyjny do funkcja członka kontrola w kontrolerfunkcja init. Z dokumentacji Sencha: Funkcja kontrolna ułatwia słuchanie zdarzeń na twoich klasach widoków i podejmowanie pewnych działań z funkcją obsługi.

Szybki przykład prosto z ExtJS docs:

Ext.define('MyApp.controller.Users', { 
extend: 'Ext.app.Controller', 

init: function() { 
    this.control({ 
     'viewport > panel': { 
      render: this.onPanelRendered 
     } 
    }); 
}, 

onPanelRendered: function() { 
    console.log('The panel was rendered'); 
} 
}); 

Nadzieja to pomaga. Cheers

+0

Jak możemy dodać wiele słuchacza do sklepu wewnątrz pliku sterownika var ps = this.getMyStore(); ps.on ({ \t beforesync: this.beforesync, \t finishupdate: this.finishupdate, \t finishedWriting: this.finishedWriting, zakres:. to }); – aswininayak