我目前正在开发某种todo应用。我可以通过访问url中的id参数轻松导航到任何列表,然后将其传递给flowrouter,没问题。但现在我想要一个像“收件箱”这样的默认列表始终是导航到localhost:3000时的第一个屏幕,所以路由“/”。我有一个名为“列表”的数据库,我在其中保存所有列表,也列出“收件箱”列表。但是,如何在访问“/”时定义导航到http://localhost:300/lists/idOfListInbox的路线?我想在我的个人资料中保存这个特殊列表的id,但这不起作用,因为Meteor.user()在flowrouter的动作部分中没有自己的顶级字段,我不想使用会话或饼干。任何人都知道如何解决这个问题?
答案 0 :(得分:1)
假设您使用kadira:flow-router
,则可以定义trigger on enter。此功能在呈现页面之前运行,并允许检查某些状态,例如,如果用户已登录。这也允许获取当前用户的收件箱ID。
要做到这一点,你需要一个流星方法。此方法还会检查当前用户是否为登录用户和注册用户(因为客户端中的Meteor.user()
始终可以被操作。)如果它是有效的iser,则该方法将检索用户的列表文档并返回{ {1}}。
_id
注意:这只是一个示例,假设每个列表文档都通过名为Meteor.methods({
'getListByUser'() {
// check user permission
if (!this.userId || !Meteor.users.findOne(this.userId))
throw new Error("permission denied");
// get listId by userId
return Lists.findOne({userId:this.userId})._id;
}
});
的字段与用户建立连接。在您的情况下,您需要以特定的方式获取用户的列表。
然后,相应的路由调用userId
服务器方法获取triggersEnter
并将用户重定向到他/她的收件箱。
listId
这可以是使用触发器输入的一种解决方案。还有另一种设计,一旦从根路径中的方法加载FlowRouter.route('/', {
// calls just before the action
triggersEnter: [function(){
Meteor.call("getListByUser", function(err, listId) {
if (err) { /* handle err */ }
if (listId) redirect('/lists/'+listId);
});
}],
action: function() {
// do something you like
},
});
,就可以将lists
模板集成到您在/
(根)路径中呈现的模板中模板。我不鼓励这样做,因为它带走了一些灵活性,你可以将两个模板相互硬连接。