Ember 路由重定向

2018-01-06 17:48 更新

聲明:對于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)。

1,切換路由前獲取model

如果你想在路由切換的時候不加載model你可以調(diào)用beforeModel回調(diào),在這個回調(diào)中實現(xiàn)路由的切換。

beforeModel() {
    this.transitionTo('posts');
}

2,切換路由后獲取model

有些情況下你需要先根據(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ù)。

3,重定向到子路由

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、modelafterModelredirect。前面三種使用場景差別不大,redirect主要用于重定向到子路由。


博文完整代碼放在Github(博文經(jīng)過多次修改,博文上的代碼與github代碼可能又出入,不過影響不大!),如果你覺得博文對你有點用,請在github項目上給我點個star吧。您的肯定對我來說是最大的動力??!

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號