一个模板为2件事MeteorJS

时间:2015-07-19 17:29:46

标签: meteor

我有posts的数据库,并且所有数据库都有bollean flagged

我有一个模板和导航像(阅读,不读)。

问题是我看到所有帖子(当我必须看到标记为false或标记为true的帖子时),我不明白为什么,我认为发布/订阅中的问题

Router.configure({
  layoutTemplate: 'layout',
  loadingTemplate: 'loading',
});

AllPostsController = RouteController.extend({
    template: 'timeTable',
    waitOn: function() {
        return Meteor.subscribe('allPosts');
    }
});

readPostController = AllPostsController.extend({
  waitOn: function() {
    return Meteor.subscribe('readPosts');
  }
});

dontreaderPostController = AllPostsController.extend({
  waitOn: function() {
    return Meteor.subscribe('dontreadPosts');
  }
});


Router.map(function() {
  this.route('timeTable', {path: '/',
        controller: AllPostsController
    });

  this.route('readPosts', {path: '/read',
        controller: readPostsController
    });

  this.route('dontreaderPosts', {
      path: '/dontreader',
      controller: dontreaderPostController
  });
});

Meteor.publish('allPosts', function(){
    return Posts.find({},{ sort: { createdAt: -1 }});
});
Meteor.publish('readPosts', function(){
    return Posts.find({read:true},{ sort: { createdAt: -1 }});
});
Meteor.publish('dontreadPosts', function(){
    return Posts.find({read:false},{ sort: { createdAt: -1 }});
});

如果有人需要更多代码,请问我

任何人帮助

编辑: David为常规任务解决了问题。我在模板助手中有特定return Posts.find(...)的主要问题。

<template name="timeTable">
        {{#if posts_exist_week}}
          {{> table posts=week}}
        {{/if}}
        {{#if posts_exist_month}}
          {{> table posts=month}}
        {{/if}}
</template>
<template name="table">
          <table class="main-table table">
              {{#each posts}}
                {{> post}}
              {{/each}}
          </table>
</template>

你解决了我的问题如果我没有模板timeTable(显示上周和月份的帖子)因为这里模板助手

Template.timeTable.helpers({
  week: function() {
    //...
    return Posts.find({createdAt: {$gte: weekstart, $lt: yesterday}},{ sort: { createdAt: -1 }}); //return posts that was created in this week
  },
  month: function() {
    //...
    return Posts.find({createdAt: {$gte: monthstart, $lte: weekstart}},{ sort: { createdAt: -1 }}); 
  }
});

现在你看,如果我选择你的决定(大卫),我会 2 !! 返回

首先 - 在路由器中 第二个 - 在模板助手

1 个答案:

答案 0 :(得分:0)

我在本地重新创建了这个,发现extend导致父控制器的waitOn运行。因此,无论何时您转到/read路线,它都会实际激活两个订阅,并且您最终会获得客户端上的所有文档。一个简单的解决方法是重构控制器,如下所示:

PostController = RouteController.extend({
  template: 'timeTable'
});

AllPostsController = PostController.extend({
  waitOn: function() {
    return Meteor.subscribe('allPosts');
  }
});

readPostController = PostController.extend({
  waitOn: function() {
    return Meteor.subscribe('readPosts');
  }
});

dontreaderPostController = PostController.extend({
  waitOn: function() {
    return Meteor.subscribe('dontreadPosts');
  }
});

话虽如此,您并不想以额外订阅恰好在其中运行时中断的方式构建您的应用。我会重写控制器,只选择与它们相关的文档。例如:

dontreaderPostController = PostController.extend({
  waitOn: function() {
    return Meteor.subscribe('dontreadPosts');
  },
  data: {selector: {read: false}}
});

现在你的帮助者可以像这样使用selector

Template.timeTable.helpers({
  week: function() {
    var selector = _.clone(this.selector || {});
    selector.createdAt = {$gte: weekstart, $lt: yesterday};
    return Posts.find(selector, {sort: {createdAt: -1}});
  }
});

另请注意,在发布函数中排序可能没用 - 请参阅http://home.arcor.de/martin.honnen/xslt/test2015072101.html