我是网络开发的新手,我正在学习Meteor。我几乎都在关注Discover Meteor的书,但当我稍微偏离时,我收到了一个错误。
以下代码工作正常,永久链接的工作原理如下:
router.js
Router.configure({
layoutTemplate: 'layout',
loadingTemplate: 'loading',
waitOn: function() {return Meteor.subscribe('allPosts')}
});
Router.map(function() {
this.route('postsList', {path: '/'});
this.route('postPage', {
path: '/posts/:_id',
data: function(){return Posts.findOne(this.params._id)}
});
});
Router.onBeforeAction('loading');
但是当我将以下内容添加到Router.map时,它无法正常工作:
this.route('byName',{
path: '/posts/:name',
data: function(){return Posts.findOne({name: this.params.name})}
})
要清楚,我将展示我的模板:
<template name = 'byName'>
{{> postItem}}
</template>
<template name = 'postPage'>
{{> postItem}}
</template>
我的post_item.html:
<template name = 'postItem'>
<div class = "post">
Name: {{name}}, Post: {{post}}
<a href = "{{pathFor 'postPage'}}">See Post</a>,
<a href = "{{pathFor 'byName'}}">By Name</a>
</div>
</template>
当我点击帖子的“看帖子”时
Name: Wonder Woman, Post: Hera, give me strength! See Post, By Name
我收到同样的帖子。但是当我点击By Name时,我得到了
Name: , Post: See Post, By Name
没有填写任何值。我究竟做错了什么?感谢。
答案 0 :(得分:1)
尝试在每个路线的数据参数中添加console.log()
语句......就像这样:
this.route('postPage', {
path: '/posts/:_id',
data: function(){
console.log("route -> postPage")
return Posts.findOne(this.params._id)
}
});
this.route('byName',{
path: '/posts/:name',
data: function(){
console.log("route -> byName");
return Posts.findOne({name: this.params.name})
}
});
我想你会看到这个问题。我不确定您要通过示例尝试实现的目标,因此我不确定是否有特定方法可以解决您的问题。但是,我会提供一个选项,因此您可以看到以下内容可行:
this.route('byName',{
path: '/posts/name/:name',
data: function(){
console.log("route -> byName");
return Posts.findOne({name: this.params.name})
}
});
请注意我是如何给它一个不同的匹配路径的?
在您的示例中,您的路径基本相同(由于参数名称,它们看起来不同,但它们都指向/posts/<string>
)。由于铁路由器遍历路由以便正确处理路径,因此它会遇到postPage
路由,该路由首先匹配模式。该路由查找单个Post
,_id
等于某个字符串(传递的name
),并显示为空。您可以切换定义路径的顺序(将byName
置于postPage
之上),然后byName
将起作用,另一个将为空。
希望有所帮助。