2

在我基於HotTowel的項目中,我使用Durandal 1.1.1進行路由。Durandal中的條件路由

我有一個登錄路線,我想激活,如果用戶沒有登錄

我的路線的配置是這樣的:。

var routes = [ { 
    url: 'login', 
    moduleId: 'viewmodels/login', 
    name: 'Login', 
    visible: true, 
    caption: 'Login' 
    },{ 
    url: 'moduledetail/:id', 
    moduleId: 'viewmodels/moduledetail', 
    name: 'ModuleDetail', 
    visible: true, 
    caption: 'ModuleDetail' 
    } 

我想,如果用戶想要去#/moduledetail/1,是尚未驗證,瀏覽器導航到路由#/login/moduledetail/1,以便成功登錄路由後返回到#/moduledetail/1

一個可能的解決方案是把一個navigateTocanActivatemoduledetail像:

function canActivate() 
{ 
    if (!loggedIn) 
     router.navigateTo(`#/login/moduledetail/1`) 
    return false; 
} 

但在canActivate導航到另一個頁面看起來很愚蠢。

有沒有什麼方法告訴Durandal路由時,在這種情況下使用這條路由?

回答

6

在迪朗達爾2.0,這是使用router.guardRoute實現:

auth = require('auth'); 
router.guardRoute = function(model, route) { 
    return auth.loggedIn() || '#/login'; 
}; 

從我讀過,但沒有證件的行爲作品在迪朗達爾1.x中的相同Guard路由是在viewModel加載後但在視圖模型上調用activate之前調用的函數。如果爲true,則路由繼續。如果是字符串,則路由器嘗試導航到與該字符串關聯的路由。

+0

感謝您的回答。我不知道'guardRoute'加入了durandal 2.0。但是我的問題仍然存在,因爲它不適用於durandal 1.x,並且由於項目檢查點,我目前無法升級到2.0。 – mehrandvd

+0

「從我讀過的內容來看,雖然沒有文檔,但Durandal 1.x中的行爲同樣如此。」 –

+0

但是我沒有在Duranda 1.x中找到任何名爲'guradRoute'的函數! – mehrandvd