2011-10-24 11 views
6

Próbowałem uruchomić to od dłuższego czasu, ale nadal nie byłem w stanie znaleźć rozwiązania tego problemu, z wyjątkiem dodania w odbiorcach podpowiedzi. Ale chcę, żeby kontroler sobie z tym poradził.Wyzwalacz kontrolera ExtJS w hiperłączu kliknij

Czy ktoś ma pomysł, w jaki sposób mogę rozwiązać ten problem?

To jest to, co mam w moich plikach w momencie http://pastie.org/2751446

controller/App.js 

    Ext.define('HD.controller.App', { 
    extend: 'Ext.app.Controller' 
    ,views: [ 
     'core.Header', 
     'core.Navigation', 
     'core.Content' 
    ] 
    ,init: function() { 
     this.control({ 
      'navigation a[id=tab1]': { 
       click: this.newTab 
      } 
     }) 
    } 
    ,newTab: function() { 
     console.log('Tab 1 should be loaded now'); 
    } 
}); 

view/rdzeń/Navigation.js

Ext.define('HD.view.core.Navigation', { 
    extend: 'Ext.panel.Panel' 
    ,name: 'navigation' 
    ,alias: 'widget.navigation' 
    ,layout: 'accordion' 
    ,region: 'west' 
    ,width: 200 

    ,title: 'Navigation' 
    ,collapsible: true 

    ,items: [ 
     { 
      title: 'Title 1' 
      ,html: '<a id="tab1" style="cursor:pointer;">Tab 1</a>' 
     }, 
     { 
      title: 'Title 2' 
      ,html: 'Second' 
     } 
    ] 
}); 

Odpowiedz

7

Sposób, w jaki próbują odwoływać hiperłącze a won” t działa.

this.control({ 
    'navigation a[id=tab1]': { 
     click: this.newTab 
    } 
}) 

Poszukiwane będą tylko komponenty ExtJS, a nie DOM. Najprawdopodobniej będziesz musiał dołączyć kliknięcie w porenderowanie lub coś podobnego. Nie oznacza to, że nie można opuścić metod, które wykonują całą pracę w kontrolerze.

Edit:

var controller = this; 
controller.control({ 
    'navigation': { 
     afterrender: function() { 
      Ext.get('tab1').on('click', function() { 
       controller.newTab(); 
      }); 
     } 
    } 
}) 
+0

Dzięki za s_hewitt odpowiedzi. Spróbuję zamienić to w coś, co działa, kiedy wracam do domu z pracy :) – Ole

+0

Próbowałem to rozwiązać. Jeśli zastąpię komentarz w poszczegółowaniu widoku ostrzeżeniem, zostanie on poprawnie uruchomiony. Ale jest to połączenie między widokiem a kontrolerem, z którym walczę. Również nie jestem pewien, czy zrobiłem to dobrze w odniesieniu do części "newTab" w moim kontrolerze. Oto mój obecny kod: http://pastie.org/2757329 – Ole

+0

Przenieś odbiornik 'afterrender' do kontrolera. Zobacz moją edycję. –

2

I zmagali się z emisji, jak również. Najważniejsze jest to, że konfiguracja kontrolera kontrolera nie działa tak, jak zwykli słuchacze i będzie działać tylko na zdarzeniach wywoływanych przez komponent, a nie przez DOM, jak zauważył s_hewitt.

Rozwiązania alternatywne są nieco brzydkie w przypadku detektorów na elementach lub elementach nadrzędnych, w których można również używać delegatów. Po przejściu przez tę trasę nie jest tak czysto, jak konfigurowanie słuchaczy w kontrolerze.

Inną sztuczką kiedyś obejść to ograniczenie jest wywołanie metody kontrolera z komponentów widok jak to:

MyApp.app.getController('MyController').myFunction(); 
+0

Dzięki za dane wejściowe DmitryB. Ale modyfikując odpowiedź s_hewitta, moja aplikacja działa teraz na wszystkich widokach kontrolowanych tylko przez kontroler, ale zapamiętuję to na wypadek, gdy muszę zrobić takie podejście :) – Ole