12

アプリでmeteor-paginated-subscriptionパッケージを使用しています。サーバー上で、私のパブリケーションは次のようになります。

Meteor.publish("posts", function(limit) {
  return Posts.find({}, {
    limit: limit
  });
});

そしてクライアント上で:

this.subscriptionHandle = Meteor.subscribeWithPagination("posts", 10);

Template.post_list.events = {
  'click #load_more': function(event, template) {
    template.subscriptionHandle.loadNextPage();
  }
};

これはうまく機能しますが、次のようなヘルパーを使用して、すべてのデータがクライアントにロードされている場合は #load_more ボタンを非表示にしたいと思います。

Template.post_list.allPostsLoaded = function () {
  allPostsLoaded = Posts.find().count() <= this.subscriptionHandle.loaded();
  Session.set('allPostsLoaded', allPostsLoaded);
  return allPostsLoaded;
};

問題は、 Posts.find().count() が、サーバーで利用可能な数ではなく、クライアントにロードされたドキュメントの数を返すことです。

meteor-paginated-subscription パッケージも使用するTelescopeプロジェクトを調べたところ、やりたいことを実行するコードが見つかりました。

allPostsLoaded: function(){
  allPostsLoaded = this.fetch().length < this.loaded();
  Session.set('allPostsLoaded', allPostsLoaded);
  return allPostsLoaded;  
}

しかし、それが実際に機能しているかどうかはわかりません。彼らのコードを私のものに移植してもうまくいきません。

最後に、Mongo は私のやりたいことをサポートしてくれているようです。ドキュメントによると、デフォルトでは、cursor.count() は limit の影響を無視します。

部品は揃っているようですが、組み立てるのに苦労しています。

4

8 に答える 8

7

反応的なソリューションを提供するものがないため、本当に必要な答えはありません。

このパッケージはまさにあなたが望むことを行い、反応的でもあります。

パブリッシュ カウント

于 2015-01-11T05:38:08.960 に答える
6

デモを見ることができると思います: counts-by-room in meteor doc

サーバーで投稿の数を公開し、クライアントで取得するのに役立ちます

これを簡単に書くことができます:

// server: publish the current size of your post collection
Meteor.publish("counts-by-room", function () {
  var self = this;
  var count = 0;
  var initializing = true;

  var handle = Posts.find().observeChanges({
    added: function (id) {
      count++;
      if (!initializing)
        self.changed("counts", 'postCounts', {count: count});
    },
    removed: function (id) {
      count--;
      self.changed("counts", postCounts, {count: count});
    }

  });

  initializing = false;
  self.added("counts", 'postCounts', {count: count});
  self.ready();

  self.onStop(function () {
    handle.stop();
  });
});

// client: declare collection to hold count object
Counts = new Mongo.Collection("counts");

// client: subscribe to the count for posts
Tracker.autorun(function () {
  Meteor.subscribe("postCounts");
});

// client: simply use findOne, you can get the count object
Counts.findOne()
于 2015-08-21T01:05:29.053 に答える
4

のアイデアはsub.loaded()、まさにこの問題を解決することです。

Posts.count()ご想像のとおり、Meteor はクライアント上でサーバー上に存在する投稿の実際の数を知る方法がないため、正しいものを返すことはありません。しかし、クライアントが認識しているのは、読み込もうとした投稿の数です。それがあなたに教えてくれることであり、サーバー上にさらに投稿があるかどうかを.loaded()行が教えてくれる理由です.this.fetch().length < this.loaded()

于 2013-09-12T04:04:30.297 に答える
2

私がすることは、次のようにカウントを取得する Meteor サーバー側メソッドを作成することです。

Meteor.methods({
    getPostsCount: function () {
        return Posts.find().count();
    }
});

次に、クライアントでそれを呼び出して、反応性を高めます。

function updatePostCount() {
    Meteor.call('getPostsCount', function (err, count) {
        Session.set('postCount', count); 
    });
}
Posts.find().observe({
    added: updatePostCount,
    removed: updatePostCount
});
于 2013-09-11T15:31:40.897 に答える
2

この質問は古いですが、最終的にはうまくいく答えを提供すると思いました。私は解決策を作成しませんでした。ここでその基礎を見つけました (そのため、クレジットが必要な場合はクレジット): Discover Meteor

とにかく、私の場合、クライアント側からデータベースの「サイズ」を取得しようとしていたので、「もっと読み込む」ボタンをいつ非表示にするかを判断できます。テンプレート レベルのサブスクリプションを使用していました。ああ、このソリューションを機能させるには、reactive-var -package を追加する必要があります。これが私の(要するに)です:

/*on the server we define the method which returns
 the number of posts in total in the database*/

if(Meteor.isServer){
  Meteor.methods({
    postsTotal: function() {
    return PostsCollection.find().count();
    }
  });
}


/*In the client side we first create the reactive variable*/

if(Meteor.isClient){
  Template.Posts.onCreated(function() {
    var self = this;
    self.totalPosts = new ReactiveVar(); 
  });


  /*then in my case, when the user clicks the load more -button,
  we call the  postsTotal-method and set the returned value as 
  the value of the totalPosts-reactive variable*/

  Template.Posts.events({
    'click .load-more': function (event, instance){
        Meteor.call('postsTotal', function(error, result){
            instance.totalPosts.set(result);
        });
    }
  });

}

これが誰かの役に立てば幸いです (最初にリンクを確認することをお勧めします)。テンプレート レベルのサブスクリプションについては、これを私のガイドDiscover Meteor - テンプレート レベルのサブスクリプションとして使用しました。これは私の最初のスタック投稿で、Meteor を学んでいるところです。ご容赦ください...:D

于 2015-11-06T15:48:58.360 に答える
1

同じ問題があり、pubs-manager パッケージでは publish-counts パッケージを使用しても機能しませんでした。リアクティブなサーバーからクライアントへのセッションを設定し、このセッションでドキュメント数を保持できるパッケージを作成しました。ここで例を見つけることができます:

https://github.com/auweb/server-session/#getting-document-count-on-the-client-before-limit-is-applied

于 2015-11-26T11:08:22.743 に答える
1

この投稿は古いですが、とにかく誰かを助けるかもしれません。まったく同じ問題がありました。私は2つの簡単な行でそれを解決することができました...覚えておいてください:

handle = Meteor.subscribeWithPagination('posts', 10);

さて、私はクライアントhandle.loaded()とで使用しましたPosts.find().count()。それらが異なる場合、すべての投稿が読み込まれていることを意味するためです。だからここに私のコードがあります:

"click  #nextPosts":function(event){
    event.preventDefault();
    handle.loadNextPage();
    if(handle.loaded()!=Posts.find().count()){
        $("#nextPosts").fadeOut();
    }
}
于 2015-02-25T14:51:15.623 に答える
0

私はこのようなことをしています:

顧客の場合

Template.postCount.posts = function() {
    return Posts.find();
};

次に、テンプレートを作成します。

<template name="postCount">
  {{posts.count}}
</template>

次に、カウンターに表示したいもの: {{> postCount}}

私が見たどのソリューションよりもはるかに簡単です。

于 2014-07-12T02:29:38.233 に答える