W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
聲明:對于transition這個詞直譯是“過渡”的意思,但是總覺得“路由的過渡”讀起來總有那么一點別扭,想了下于是就用“切換”替代吧,如有不妥歡迎指正。
我們熟知的Java、PHP等語言都提供了URL的重定向,那么Ember的重定向又是怎么去實現(xiàn)的呢?
如果是從路由重定向到另外一個路由你可以調(diào)用transitionTo
方法,如果是從controller
重定向到一個route
則調(diào)用transitionToRoute
方法。transitionTo
方法所實現(xiàn)的功能與link-to
的作用是一樣的,都可以實現(xiàn)路由的切換。
如果重定向之后的路由包含有動態(tài)段你需要解析model
數(shù)據(jù)或者指定動態(tài)段的值。由于不是直接執(zhí)行URL所以不會執(zhí)行重定向之后的路由的model
回調(diào)。
如果你想在路由切換的時候不加載model
你可以調(diào)用beforeModel
回調(diào),在這個回調(diào)中實現(xiàn)路由的切換。
beforeModel() {
this.transitionTo('posts');
}
有些情況下你需要先根據(jù)model
回調(diào)獲取到的數(shù)據(jù)然后判斷跳轉(zhuǎn)到某個路由上。此時你可以使用afterModel
回調(diào)方法。
afterModel: function(model, transition) {
if (model.get(‘length’) === 1) {
this.transitionTo('post', model.get('firstObject'));
}
}
切換路由,并初始化數(shù)據(jù)為model
的第一個元素數(shù)據(jù)。
Router.map(function() {
this.route('posts', function() {
this.route('post', { path: '/:post_id'});
});
});
子路由的重定向有些許不同,如果你需要重定向到上面這個段代碼的子路由posts.post
上,如果是使用beforeModel
、model
、afterModel
回調(diào)重定向到posts.post
父路由posts
會重新在執(zhí)行一次,再次執(zhí)行父路由這種方式就顯得有點多余了,特別父路由需要加載的數(shù)據(jù)比較多的時候,會影響到加載的效率。
如果是這種情況我們可以使用redirect
回調(diào),此回調(diào)不會再次執(zhí)行父路由。僅僅是實現(xiàn)路由切換而已。
redirect: function(model, transition) {
if (model.get('length') === 1) {
this.transitionTo('posts.post', model.get('firstObject'));
}
}
重定向到子路由,解析之后會得到的類似于posts/2
這種形式的URL。
以上就是全部路由的重定向方式,主要有4個回調(diào):beforeModel
、model
、afterModel
、redirect
。前面三種使用場景差別不大,redirect
主要用于重定向到子路由。
博文完整代碼放在Github(博文經(jīng)過多次修改,博文上的代碼與github代碼可能又出入,不過影響不大!),如果你覺得博文對你有點用,請在github項目上給我點個star
吧。您的肯定對我來說是最大的動力??!
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: