2012-05-09 3 views
3

今日は流星を使い始めたばかりなので、何が間違っているのか分からないようです。パブリッシュ関数内で実行されているクエリがありますが、このクエリは別のクエリの結果によってフィルタリングされます。つまり、公開されているデータベース(CollectionTwo)にドキュメントを追加すると、期待通りに動作しますが、フィルタリングに使用されているデータベース(CollectionOne)に変更を加えると、流星は反応的に行動しない。クエリが別のクエリでフィルタリングされたときの反応の更新

CollectionOne = new Meteor.Collection("one") 
CollectionTwo = new Meteor.Collection("two") 

Meteor.publish("items", -> 
    not_hidden = CollectionOne.find().fetch() 
    return CollectionTwo.find(_id: {'$in':(t.my_id for t in not_hidden)}) 
) 

一方、クライアント上の...

CollectionOne = new Meteor.Collection("one") 
CollectionTwo = new Meteor.Collection("two") 

Meteor.subscribe("items") 

_.extend(Template.items, 
    items: -> 
    not_hidden = CollectionOne.find().fetch() 
    return CollectionTwo.find(_id: {'$in':(t.my_id for t in not_hidden)}) 
) 

任意のアイデア適切な解決策はあるかもしれない何?

+0

サブスクリプションを反応的に動作させたい場合は、Meteor.autosubscribe http://docs.meteor.com/#meteor_autosubscribe – lashleigh

+0

@lashleighを使用する必要があります。セッション変数のパラメータが変更された場合にのみ、自動サブスクライブが機能するという印象を受けました。とにかく、それはまだ動作しません。 – brysgo

+0

あなたは 'items'というコレクションを持っていないので、実際に何もしてはいけません。購読者の名前を実際のコレクションの名前にマッピングする必要があると私は確信しています。 – lashleigh

答えて

6

反応性がそのようにサーバー内のMeteor.publish内部では機能しません。 MeteorはCollectionOneの内容が変更されたときにCollectionTwo.findクエリを再計算しません。

カーソルを戻すのではなく、手作業でパブリッシュを管理します。公開機能内でobserveを使用して、変更をCollectionOneで確認し、手動でthis.setthis.unsetと呼んで、クライアントに変更をプッシュする必要があります。 publish documentationにこの手法の例があります。この例では、1つのコレクションのみを表示しますが、アイデアをネストされたオブザーバのセットに拡張できます。

この種のパターンを実装しやすくするために、砂糖に取り組んでいきます。

+1

悲しいことに、このマニュアルのようなものは実際にマニュアルにはありません:( - setとunsetは完全に文書化されていませんが、そのようなパターンの例を追加する方法はありますか?今は自分のコレクションに任意のフィールドを追加して、 –

+0

反応性は、[reactive-publish](https://github.com/peerlibrary/meteor-reactive-publish)パッケージ(私は著者の一人)で働いています – Mitar

4

コア流星にこれら二つの雰囲気のパッケージが問題を解決し、このためのより良いパターンがありますまで:

https://atmosphere.meteor.com/package/server-deps

https://atmosphere.meteor.com/package/reactive-publish

隕石と第二のパッケージをインストールし、代わりに「Meteor.reactivePublish」を使用「Meteor.publish」の「{{reactive}:true}」というオプションのクエリの結果が変更されると自動的に更新されます。

Readmeのこの例は、ユーザーのチームが見ることのできるアイテムを正確に公開し、ユーザーがチームを変更したとき、またはチームの表示アイテムが変更されたときに更新されます。重要なことは、そうでない場合autorunは、任意のフィールドに再実行されます、だけmy_idCollectionOneから照会フィールドを制限することです

Meteor.publish "items", -> 
    @autorun (computation) => 
    not_hidden = CollectionOne.find({}, {fields: my_id: 1}).fetch() 
    CollectionTwo.find _id: $in: _.pluck not_hidden, 'my_id' 

Meteor.reactivePublish(null, function() { 
    if (this.userId) { 
    var user = Meteor.users.findOne({_id: this.userId}, {reactive: true}); 
    if (user.team) { 
     var team = Collections.teams.findOne({_id: user.team}, {reactive: true}); 
     var visibleItems = _.compact(team.visibleItems); 
     return Collections.items.find({_id: {$in: visibleItems}}); 
    } 
    } 
}); 
+0

これは素晴らしいアプローチです。あなたが興味を持っているフィールドを 'Meteor.users'に限定しなければなりません。さもなければあなたのリアクティブパブリッシュはいつでも再実行されます。フィールドの変更。 – Mitar

0

あなたはreactive-publishパッケージを(私は著者の一人です)を使用することができますmy_idだけでなく、CollectionOne文書の変更

関連する問題