2017-08-03 114 views
0

正如每個應用程序中我有幾條路線。例如(router/index.js節選):vue.js:路由守衛等待異步值

[{ 
    path: '/reporting', 
    name: 'Reporting', 
    component: reporting, 
    meta: { 
     adminOnly: true 
    } 
}, 
...] 

正如你可以在路線定義見,訪問reporting當用戶需要有管理員權限,這在vuex商店的屬性。問題:這個屬性是異步的,當初訪問警衛時當然是錯誤的。我怎樣才能讓我的警衛等待呢?

後衛:

if (to.matched.some(route => route.meta.adminOnly)) { 
    if (store.getters.userInfo.isAdmin) { 
     next() 
    } else { 
     next('/') 
    } 
} else { 
    next() 
} 
+0

如何以及在哪裏獲取此屬性? – Cobaltway

+0

它在init的vuex存儲中完成。 – sandrooco

+0

然後在該登錄操作解決之前,您不應該啓動您的應用程序。隨着行動回覆承諾,你應該很容易。 –

回答

1

什麼看,吸氣,用store.watch

假設您的獲得者返回null如果尚未獲取數據。

if (store.getters.userInfo.isAdmin === null) { 
    const watcher = store.watch(store.getters.userInfo.isAdmin, isAdmin => { 
     watcher(); // stop watching 
     if (isAdmin) next(); 
     else next('/'); 
    }); 
} 
else if (store.getters.userInfo.isAdmin) next(); 
else next('/'); 
+0

它拋出'[vuex] store.watch只接受函數'...? – sandrooco

+0

好吧,我設法弄明白:重要的是你的getter返回一個實際的功能,getter本身是不夠的。 'someGetter(狀態){ 回報函數(){ 返回state.xx } }' – sandrooco

+0

有避免重複碼'''如果store.getters.userInfo.isAdmin)next()的一個圖案; else next('/');'''?你會怎麼做? –