2013-05-09 71 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