3

私は今日流星を使い始めたばかりで、何が間違っているのか理解できないようです。公開関数内で実行されているクエリがありますが、このクエリは別のクエリの結果によってフィルタリングされます。

つまり、公開されているデータベース(CollectionTwo)にドキュメントを追加すると、期待どおりに機能しますが、フィルタリングに使用されているデータベース(CollectionOne)に変更を加えると、meteorは反応的に動作しません。 。

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

適切な解決策は何か考えはありますか?

4

3 に答える 3

6

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

必要なものを実装するには、カーソルを返すだけでなく、手動で公開を管理します。observeの変更を監視するには、公開関数内で使用する必要があります。CollectionOne次に、手動で呼び出しthis.setて、this.unset変更をクライアントにプッシュします。公開ドキュメントにこの手法の例があります。この例では1つのコレクションのみを調べていますが、ネストされたオブザーブのセットにアイデアを拡張できます。

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

于 2012-05-10T23:46:15.037 に答える
4

コア流星でこれにより良いパターンができるまで、これらの2つの大気パッケージは問題を解決します。

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

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

2番目のパッケージをmeteoriteとともにインストールし、「Meteor.publish」の代わりに「Meteor.reactivePublish」を使用すると、オプション{"reactive":true}を使用したクエリの結果が変更されたときに自動的に更新されます。

このreadmeの例では、ユーザーのチームが表示できるアイテムを正確に公開し、ユーザーがチームを変更するか、チームの表示アイテムが変更されると更新されます。

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}});
    }
  }
});
于 2014-01-25T00:18:41.287 に答える
0

あなたはreactive-publishパッケージを使うことができます(私は著者の一人です):

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

重要なことは、クエリされたフィールドをCollectionOneからのみに制限することですmy_id。そうしないと、だけでなく、ドキュメントautorun内のフィールドが変更されたときに再実行されます。CollectionOnemy_id

于 2015-10-03T12:08:46.500 に答える