Meteor,为每个用户定义“标准路线”

时间:2018-01-11 21:17:26

标签: javascript meteor database-design meteor-blaze flow-router

我目前正在开发某种todo应用。我可以通过访问url中的id参数轻松导航到任何列表,然后将其传递给flowrouter,没问题。但现在我想要一个像“收件箱”这样的默认列表始终是导航到localhost:3000时的第一个屏幕,所以路由“/”。我有一个名为“列表”的数据库,我在其中保存所有列表,也列出“收件箱”列表。但是,如何在访问“/”时定义导航到http://localhost:300/lists/idOfListInbox的路线?我想在我的个人资料中保存这个特殊列表的id,但这不起作用,因为Meteor.user()在flowrouter的动作部分中没有自己的顶级字段,我不想使用会话或饼干。任何人都知道如何解决这个问题?

1 个答案:

答案 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模板集成到您在/(根)路径中呈现的模板中模板。我不鼓励这样做,因为它带走了一些灵活性,你可以将两个模板相互硬连接。