App.Router.map(function() { this.resource('topCharts', function() { this.route('choose', { path: '/' }); this.route('albums'); this.route('songs'); this.route('artists'); this.route('playlists'); }); }); App.TopChartsChooseRoute = Ember.Route.extend({ beforeModel: function() { var lastFilter = this.controllerFor('application').get('lastFilter'); this.transitionTo('topCharts.' + (lastFilter || 'songs')); } }); // Superclass to be used by all of the filter routes below App.FilterRoute = Ember.Route.extend({ activate: function() { var controller = this.controllerFor('application'); controller.set('lastFilter', this.templateName); } }); App.TopChartsSongsRoute = App.FilterRoute.extend(); App.TopChartsAlbumsRoute = App.FilterRoute.extend(); App.TopChartsArtistsRoute = App.FilterRoute.extend(); App.TopChartsPlaylistsRoute = App.FilterRoute.extend();
model
鉤子包含了基於承諾暫停過渡的許多應用場景,可是有的時候仍是須要beforeModel
和afterModel
這兩個鉤子來提供幫助。最多見的緣由是經過{{link-to}}
或者{{transitionTo}}
(最爲URL改變致使的過渡的對比)過渡到一個具備動態URL端,這時將過渡到的路由的模型早早就被指定了(例如{{#link-to 'article' article}}
或者this.transitionTo('article', article)
),這種狀況下,model
鉤子並不會被調用。當路由正在收集全部路由的模型來執行過渡時,就須要使用beforeModel
和afterModel
鉤子來處理全部邏輯。?javascript