我的工作代码包含postsList
模板上的帖子列表,该列表会迭代postItem
块中的{{#each}}
模板。加载此模板后,我订阅了所有帖子posts.public
。当用户点击列表中帖子上的链接时,它会将网址路由到/posts/:_id
,然后在postPage
上显示单个帖子,该帖子只会呈现postItem
模板。这应基于对post.single
的订阅。
它有效,但我不相信我在模板级订阅方面设置正确。
这就是我所拥有的:
router.js
FlowRouter.route('/', {
name: 'mainLayout',
action() {
BlazeLayout.render('body', {main: 'postsList'});
}
});
FlowRouter.route('/post/:_id', {
name: 'Post.show',
action(params, queryParams) {
BlazeLayout.render('body', {main: 'postPage'});
}
});
对于postsList
模板,我订阅了所有帖子,并使用了{{#each}}
迭代器的帮助器:
帖-list.js
Template.postsList.helpers({
posts() {
return Posts.find({}, { sort: { createdAt: -1 } }).fetch();
},
});
Template.postsList.onCreated(function () {
Meteor.subscribe('posts.public');
});
对于我的postPage
模板,设计用于渲染单个帖子,我正在使用另一个{{#each}}
块,尽管必须有更好的方法,因为我觉得我正在迭代一个结果为了能够使用帮助函数:
发表-page.html中
<template name="postPage">
<div class="post-page page">
{{#each post}}
{{> postItem}}
{{/each}}
</div>
</template>
postPage
的以下js是我认为我有问题的地方。我不认为订阅工作正常。我的意图是在创建此模板时只订阅一个帖子。但是,我发现所有帖子都可用,我必须在post
帮助函数中指定我想要返回的帖子的特定ID。
发表-page.js
Template.postPage.onCreated( function() {
let postId = FlowRouter.current().params._id;
Meteor.subscribe('post.single', postId);
});
Template.postPage.helpers({
post() {
let postId = FlowRouter.current().params._id;
return Posts.find({_id: postId});
},
});
我的发布代码在这里:
posts.js
if (Meteor.isServer) {
Meteor.publish('posts.public', function () {
return Posts.find({}, { sort: { createdAt: -1 } });
});
Meteor.publish('post.single', function (postId) {
check (postId, String);
if ( postId ) {
return [Posts.find( {_id: postId } )];
} else {
return null;
}
});
}
所以回顾一下,代码是有效的,但我不相信我正在发布/订阅正确,因为我依靠辅助函数来返回特定的帖子,而不是订阅本身只返回一个结果。此外,我觉得有一个{{#each}}
块来迭代一个项目是不对的,但不知道任何替代方案。