2013-05-09 104 views
0

我已經建立了這樣的路線:流星路由器路由屬性未定義

Meteor.Router.add({ 
    '/:menuSlug': function(menuSlug) { 
     Template.menu.items = function() { return Items.find({menuId: Menus.findOne({slug: menuSlug})._id}); } 
     return 'menu'; 
    } 
}); 

然而,當我瀏覽到/我的測試段塞,我得到這個錯誤

Uncaught TypeError: Cannot read property '_id' of undefined 

我想這與https://stackoverflow.com/a/14107148/979315有關,但由於我沒有使用Meteor.user()被動收集,所以我不確定如何在數據正確提取後重新呈現這個頁面。有什麼想法嗎?

+0

你檢查了menuSlug的內容嗎? 或者它可能是菜單項不存在。 – 2013-05-10 09:44:04

+0

菜單條目確實存在。在檢索數據之前加載頁面。 – 2013-05-10 18:22:16

回答

0

這可能是最好單獨從路由器代碼模板助手和使用會話哈希存儲消息:

Meteor.Router.add({ 
    '/:menuSlug': function(menuSlug) { 
     Session.set("menuslug", menuSlug); 
     return 'menu'; 
    } 
}); 

Template.menu.items = function() { 
    var item = Menus.findOne({slug: menuSlug}); 
    if(item) return Items.find({menuId: item._id}); 
}); 

另一個問題可能是,數據後下發。所以有一段時間可能沒有任何數據(特別是如果你直接加載URI的頁面)。因此,您需要考慮當地收藏中可能沒有數據的情況。

+0

我想你的意思是var item = Menus.findOne({slug:Session.get('menuSlug')}); – 2013-05-09 16:54:52

+0

當我嘗試這個時,它加載頁面,但模板缺少數據(所以沒有錯誤,這是進展)。那麼我該如何讓這個會話變量處於被動狀態,以便在數據獲取正確後立即加載到模板中? – 2013-05-09 16:55:45

+0

如果通過set/get使用'會話'散列值,它將自動被動。如果不是這可能是缺少菜單或缺少項目的問題。回收你的收藏中的什麼。 (你可以通過運行Menus.find()。fetch()和Items.find()來檢查你的js控制檯 – Akshat 2013-05-09 17:02:38