2015-07-19 49 views
0

我有分貝posts和所有的人都bollean flagged一個模板2個件事MeteorJS

我有一個模板,導航等(讀,不要讀)。

問題是,我看到的所有帖子(當我必須看到的帖子被標出虛假或標記真),我不明白爲什麼,我覺得問題在發佈/訂閱

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 }}); 
}); 

如果有人需要更多的代碼,只是問我

人幫助

編輯:大衛解決的問題的常規任務。主要問題,我在我的主板上有特定的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 }}); 
    } 
}); 

現在你看,如果我選擇你的決定(大衛)我會有 !! 返回

第一 - 在路由器 第二 - 在模板助手

+0

在你的關於失敗的問題中始終要具體 - 這有助於我們縮小搜索範圍。通過「不工作」你是什麼意思?模板不顯示?沒有數據?你看到一個錯誤? –

+0

在dontreadposts我看到所有帖子,當我必須看到只有標記的帖子:false –

+0

您是否流星刪除autopublish'?你有沒有在你的路線以外的任何地方訂閱?無論哪種方式,這是一個很好的例子,說明何時使用'data'鉤子,或者只是您模板中的助手來限制當前上下文。 –

回答

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}}); 
    } 
}); 

還要注意的是,在發佈功能排序可能沒有用處 - 見common mistakes

+0

這很好,但我的問題是,它比我說的更diffucult,因爲我有更多的代碼,我把它添加到後編輯好嗎? –

+0

我建議製作[流星墊](http://meteorpad.com/)並共享鏈接__或___,鏈接到代碼的公共存儲庫。如果你閱讀並理解了我的答案(特別是第一部分),並且你仍然需要更多幫助,那麼我需要一個完整的工作版本來檢查。看起來我的答案真的成了問題的核心 - 在請求更多幫助之前請仔細閱讀。 –

+0

給出更多的代碼,這就是爲什麼你解決它的50% –