Meteor Iron 路由器:自定义 id 路由
Meteor Iron Router : custom id route
在使用 Iron Router 和从集合中传入自定义 ID 时遇到一些问题。
一些上下文:我有一个 "groups" 的集合,其中除了自动生成的默认 _id 之外,它们都有自己的特殊 ID。我正在尝试制作一条类似于
的路线
" localhost:3000/groups/:groupid "
所以每个组都会有自己的带有组信息的渲染模板。
HTML :
<template name="Group">
<h1>Group: {{groupName}}</h1>
</template>
客户端:
从会话中获取 groupid ...
我测试了这个并且它有效所以它不是从会话中获取它的问题而是路由器
var groupid = Session.get('groupID');
Router.go('/groups/:_id',{_id: groupid})
路由器:
Router.route('/groups/:_id', function () {
this.render('Group', {
data: function () {
return GroupsList.findOne({_id: this.params._id});
}
});
});
这将呈现一个以 groupid 作为参数而不是实际编号的路由
更新:
客户
Router.go('/groups/'+ groupid);
路由器
Router.route('/groups/:groupid', function () {
this.render('Group', {
data: function () {
console.log(this.params.groupid)
console.log(GroupsList.findOne({groupID: this.params.groupid}))
return GroupsList.findOne({groupID: this.params.groupid});
}
});
});
这似乎使路由生效,但它不会在模板中呈现组名
Now that we're using named routes in Router.go you can also pass a
parameters object, query and hash fragment options.
Router.go('post.show', {_id: 1}, {query: 'q=s', hash: 'hashFrag'});
然而,当您调用 Router.go 时,您传递的不是路由名称,而是 url。
试试这个:
Router.go('/groups/' + groupid);
Router.route('/groups/:_id', function () {
this.render('Group', {
data: function () {
return GroupsList.findOne({groupid: this.params._id});
}
});
});
在答案的旁注中以防万一其他人有这个问题,我实际上发现 "this.params._id" 的数据类型存在问题,它似乎是作为数据出现的不是字符串或数字的类型,因此无法在 findOne 方法中成功使用。最后我只需要 parseInt 这就是最后的解决方案:
Router.go('/groups/'+ groupid);
Router.route('/groups/:groupid', function () {
this.render('Group', {
data: function () {
var id = parseInt(this.params.groupid)
return GroupsList.findOne({groupID: id});
}
});
});
在使用 Iron Router 和从集合中传入自定义 ID 时遇到一些问题。
一些上下文:我有一个 "groups" 的集合,其中除了自动生成的默认 _id 之外,它们都有自己的特殊 ID。我正在尝试制作一条类似于
的路线" localhost:3000/groups/:groupid "
所以每个组都会有自己的带有组信息的渲染模板。
HTML :
<template name="Group">
<h1>Group: {{groupName}}</h1>
</template>
客户端: 从会话中获取 groupid ... 我测试了这个并且它有效所以它不是从会话中获取它的问题而是路由器
var groupid = Session.get('groupID');
Router.go('/groups/:_id',{_id: groupid})
路由器:
Router.route('/groups/:_id', function () {
this.render('Group', {
data: function () {
return GroupsList.findOne({_id: this.params._id});
}
});
});
这将呈现一个以 groupid 作为参数而不是实际编号的路由
更新:
客户
Router.go('/groups/'+ groupid);
路由器
Router.route('/groups/:groupid', function () {
this.render('Group', {
data: function () {
console.log(this.params.groupid)
console.log(GroupsList.findOne({groupID: this.params.groupid}))
return GroupsList.findOne({groupID: this.params.groupid});
}
});
});
这似乎使路由生效,但它不会在模板中呈现组名
Now that we're using named routes in Router.go you can also pass a
parameters object, query and hash fragment options.
Router.go('post.show', {_id: 1}, {query: 'q=s', hash: 'hashFrag'});
然而,当您调用 Router.go 时,您传递的不是路由名称,而是 url。
试试这个:
Router.go('/groups/' + groupid);
Router.route('/groups/:_id', function () {
this.render('Group', {
data: function () {
return GroupsList.findOne({groupid: this.params._id});
}
});
});
在答案的旁注中以防万一其他人有这个问题,我实际上发现 "this.params._id" 的数据类型存在问题,它似乎是作为数据出现的不是字符串或数字的类型,因此无法在 findOne 方法中成功使用。最后我只需要 parseInt 这就是最后的解决方案:
Router.go('/groups/'+ groupid);
Router.route('/groups/:groupid', function () {
this.render('Group', {
data: function () {
var id = parseInt(this.params.groupid)
return GroupsList.findOne({groupID: id});
}
});
});