2013-10-02 16 views
5

Mam następującą trasęEvent przepuszczając przez kontrolera nadrzędnego

App.Router.map(function() { 
    this.resource('projects', {path: 'projects'}, function(){ 
     this.route('new', {path: 'new'}); 
     this.route('show', {path: ':project_id'}); 
     this.route('edit', {path: ':project_id/edit'}); 
    }); 
}); 

Chcę wszystkie zdarzenia z „ProjectsNewController”, „ProjectsShowController”, „ProjectsEditController” bulgotać do „ProjectsController”.

Jak mogę to osiągnąć? JSBin: http://jsbin.com/ucanam/1284/edit

Odpowiedz

15

Sposób zdarzenie propagacji prace w Ember jest nie:

ChildController -> Controller -> ParentController 

ale raczej:

View -> Controller -> Route -> ApplicationRoute (optionally) 

Dlatego jeśli zdarzenie jest zwolniony z view to będzie bańka górę do controller i zatrzymaj się tam, jeśli controller zwraca true z programu obsługi zdarzeń, to będzie nadal ubieł do route. Zdarzenia, które nie są obsługiwane w trybie controller ani route, będą dymić do numeru ApplicationRoute.

Aby osiągnąć to, co chcesz zrobić, należy użyć needs API, aby uzyskać dostęp do ProjectsController i wysyłania zdarzeń/działań do tej controller użyciu .send(...).

Na przykład:

App.ProjectsController = Ember.ArrayController.extend({ 
    actions:{ 
    newProject: function() { 
     console.log("ProjectsController:newProject"); 
    } 
    } 
}); 

App.ProjectsNewController = Ember.ObjectController.extend({ 
    needs: ['projects'], 
    actions:{ 
    newProject: function() { 
     console.log("ProjectsNewController:newProject"); 
     // forward action to ProjectsController 
     this.get('controllers.projects').send('newProject'); 
    } 
    } 
}); 

App.ProjectsEditController = Ember.ObjectController.extend({ 
    needs: ['projects'], 
    actions:{ 
    newProject: function() { 
     console.log("ProjectsEditController:newProject"); 
     // forward action to ProjectsController 
     this.get('controllers.projects').send('newProject'); 
    } 
    } 
}); 

Nadzieję, że to pomaga.

+0

Bubbling w routerze przechodzi przez całą hierarchię tras do trasy aplikacji. Tak więc jedna akcja może być obsługiwana przez wiele zagnieżdżonych tras, jeśli ich obsługa jest w fazie bubble (true). – chrmod

Powiązane problemy