2015-03-02 117 views
2

我正在嘗試製作一個非常簡單的應用程序,可以發佈帖子。我希望帖子頁面上的每個條目按{ createdAt: -1 }排序。當我第一次訪問該頁面時,這是有效的。但是,當我發佈新帖子時,它會追加到頁面的底部。流星;在發佈後不立即在客戶端排序

the latest post is at the bottom

(注意最新帖子是在底部)。當我重新加載頁面時,它似乎可以正常工作和排序,但在提交後立即進入頁面底部。

我的服務器端代碼如下(/server/publications.js):

Meteor.publish('posts', function(limit) { 
    limit = limit || Meteor.settings.public.pageLimit; 
    check(limit, Number); 
    var options = { 
    sort: { createdAt: -1 }, 
    limit: limit 
    }; 
    return Posts.find({}, options); 
}); 

在我的客戶,我有這個(/client/subscriptions.js):

Meteor.subscribe('posts'); 

我怎樣才能在提交後進行崗位排序正確立即?

+0

你在哪裏調用客戶端上的發現?你是否嘗試過使用限制和排序在客戶端以及服務器? – 2015-03-02 16:00:12

+0

@corvid如果您需要在客戶端上訂購文檔,請在客戶端進行分類。請參閱[本文](http://dweldon.silvrback.com/common-mistakes)的「排序發佈」部分。 – 2015-03-02 17:04:03

回答

1

讓我們讓訂閱被動。

Tracker.autorun(function(){ 
    Meteor.subscribe('posts'); 
} 

爲什麼不製作一個簡單Publish-Subscribe

,並使用這個幫手?在clien噸方。

Template.postsExample.helpers({ 
    posts: function() { 
    return Posts.find({}, {sort: {submitted: -1}}); 
    } 
}); 
+0

不幸的是,這似乎沒有按預期工作 – corvid 2015-03-02 15:56:39

+0

@corvid檢查答案更新 – Ethaan 2015-03-02 16:01:24

+1

是的,這工作。似乎有點反直覺做到這一點在前端和後端 – corvid 2015-03-02 20:23:55

1

你可以試試這個,讓我知道嗎?

Meteor.publish('posts', function(limit) { 
    limit = limit || Meteor.settings.public.pageLimit; 
    check(limit, Number); 
    var options = { 
    sort: {submitted: -1}, 
    limit: limit 
    }; 
    return Posts.find({}, options); 
}); 
+0

唉,這並沒有工作......我認爲它與客戶端 – corvid 2015-03-02 15:50:56

4

我認爲解決的辦法是相當明顯的:你應該排序在客戶端,而不是服務器端。我猜你有一個幫助函數,其中包含對帖子的查詢?在那裏添加排序。

基本解釋:Meteor嘗試在插入/更新時向客戶端推送最小量的信息。我猜它並沒有完全重新運行訂閱服務器端,這正是你所期望的,但它只是發送最後一個添加到客戶端集合的元素。

(注意:是100%正確的,你需要雙方的排序,你是限制結果集,以及和你只想最近要推的大小。)

+0

排序在客戶端和服務器解決了我的問題,但這並不感覺很優雅 – API 2016-03-29 19:14:33

0

由於您正在使用排序和限制來檢索最近發佈的帖子,因此您需要繼續按照現在的方式發佈該功能。發佈功能中的排序是允許服務器只發送最近的[限制]帖子給客戶端。

當添加一個新帖子時,服務器不會訴諸所有文檔,它只是發送新的添加,該添加會添加到客戶端上的Minimongo。客戶需要對Minimongo提供的記錄進行排序。

如果你的模板是這樣的:

<template name="listOfPosts"> 
    {{#each posts}} 
     <div>{{content}}</div> 
     <div>Submitted by: {{author}}</div> 
     <div>{{submitted}}</div> 
    {{/each}} 
</template> 

然後你的助手爲食的模板應該有一種符:

Template.listOfPosts.helpers({ 
    posts: function() { 
     return Posts.find({}, {sort: {submitted: -1}}); 
    } 
});