5

サーバー側の変更についてクライアントに通知する必要があります。私の場合、サーバーとクライアントで異なるコレクションを使用しています(この質問の詳細:meteor.jsを使用してピンタレストのようなページを作成するにはどうすればよいですか)。

サーバー上で、外部APIから新しい製品を取得しています。レイアウトがうまく機能するために必要なローカル変数を更新できる新しいアイテムの数をすべてのクライアントに公開したいと思います。どうやってするの?

Meteor.Collection以外の種類のデータをパブリッシュ/サブスクライブできればいいのですが。Meteor.depsを見つけましたが、私が理解していることは、クライアント側でのみ機能します。

4

2 に答える 2

2

あなたが望むことを達成するために、あなたは別のコレクションを必要とします-クライアント上に。サーバーの公開機能で、ドキュメントを最初から作成し、製品の現在の数を属性に割り当てます。observe()とsetを使用してcount、ドキュメントが製品に追加または製品から削除されるタイミングを変更します。countクライアントの「レコードセット」をサブスクライブします。

// Server
Meteor.publish('count', function () {
    // Build a document from scratch
    var self = this;
    var uuid = Meteor.uuid();
    var count = Products.find().count();
    // Assign initial Products count to document attribute
    self.set('count', uuid, {count: count});

    // Observe Products for additions and removals
    var handle = Products.find().observe({
        added: function (doc, idx) {
            count++;
            self.set('counts', uuid, {count: count});
            self.flush();
        },
        removed: function (doc, idx) {
            count--;
            self.set('counts', uuid, {count: count});
            self.flush();
        }
    });
    self.complete();
    self.flush();
    self.onStop(function () {
        handle.stop();
    });
});

// Client
Counts = new Meteor.Collection('count');
Meteor.subscribe('count');
console.log('Count: ' + Counts.findOne().count);
于 2013-02-11T21:14:14.670 に答える
0

上記のソリューションは 1 つの方法を示したと言わざるを得ませんが、observe() に接続されていないクライアント データにパブリッシュする必要がある場合はどうすればよいでしょうか? または任意のコレクションで?

私の場合、つまり1000個の製品があります。訪問者を引き付けるために、乱数の製品のタイムスタンプを更新し、コレクションをタイムスタンプで並べ替えて表示することで、コレクションを「リフレッシュ」しています。これのおかげで、訪問者は何かが起こっているという印象を受けます。

私のrefreshメソッドは製品の数を返します (ランダムです)。その番号をすべてのクライアントに渡す必要があります。私はそれをしましたが、(私が思うに)醜い回避策を使用しています。

私のrefreshメソッドは を設定しますSession.set('lastRandomNo', random)。ところで:セッションがサーバー側で機能することを知りませんでした。refresh製品コレクションを更新します。

次に、上記の回答に従って:

Meteor.publish 'refreshedProducts', ->

self = this
uuid = Meteor.uuid()

# create a new collection to pass ProductsMeta data
self.set('products_meta', uuid, { refreshedNo: 0 })

handle = Products.find().observe
  changed: (newDocument, atIndex, oldDocument) ->
    self.set('products_meta', uuid, { refreshedNo: Session.get('lastRandomNo') })
    self.flush()

self.complete()
self.flush()
self.onStop ->
  handle.stop()

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

ProductsMeta = new Meteor.Collection('products_meta')

# subscribe to server 'products_meta' collection that is generated by server
Meteor.subscribe('refreshedProducts')

ProductsMeta.find({}).observe
  changed: (newDocument, atIndex, oldDocument) ->

    # I have access to refreshedNo by
    console.log ProductsMeta.findOne().refreshedNo

どう思いますか?

于 2013-02-13T09:26:54.650 に答える