流星型路由器和模板级订阅查询

时间:2016-05-28 08:15:42

标签: javascript meteor flow-router

我的工作代码包含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}}块来迭代一个项目是不对的,但不知道任何替代方案。

0 个答案:

没有答案