2

要するに、私はやりたい:

Meteor.publish('items', function(){ 
  return Item.find({categoryId: Categories.find({active: true} });
});

「カテゴリ」の一部としてのフラグ「アクティブ」は定期的に変更されます。

また、Categories コレクションの反応性を利用して、Items コレクションのサブスクライブ/再サブスクライブを試みましたが、残念ながら、「アクティブ」フラグに影響を与えたかどうかに関係なく、Categories コレクションへの変更が再トリガーされます。

私のオプションは何ですか?

4

4 に答える 4

0
Meteor.startup(function() {
    Categories.find().observe({
        addedAt: function(doc) {
            trigger();
        },
        changedAt: function(doc, oldDoc) {
            if(doc.active != oldDoc.active) {
                trigger();
            }
        },
        removedAt: function(oldDoc) {
            trigger();
        }
    });
});

これで、trigger関数によってパブリッシュが再実行されるはずです。今回はクライアント上にあると簡単です (サブスクリプション パラメータを変更します)。サーバーでこれを行う方法がわかりません-おそらくpublishもう一度実行してください。

于 2013-07-27T23:53:26.240 に答える
0

可能な解決策は、依存オブジェクトを作成し、すべてのカテゴリの変更を監視し、アクティブ フラグが切り替えられた場合に dep の変更をトリガーすることです。これらの行に沿ったもの:

var activeCount = Categories.find({active: true}).count();

var activeDep = new Deps.Dependency();


Deps.autorun(function() {
    var activeCountNow = Categories.find({active: true}).count();
    if(activeCountNow !== activeCount) {
        activeCount = activeCountNow;
        activeDep.changed();
    }
});

Meteor.publish('items', function(){ 
    activeDep.depend();
    return Item.find({categoryId: Categories.find({active: true} });
});

注: アクティブなカテゴリの数に変更があるかどうかのみを確認しているため、アクティブなリストをメモリに保持する必要はありません。これは、アプリの動作に応じて適切な場合とそうでない場合があります。

 


 

編集:コメントに記載されている両面フレーバー:

クライアント:

var activeCount = Categories.find({active: true}).count();
var activeDep = new Deps.Dependency();

Deps.autorun(function() {
    var activeCountNow = Categories.find({active: true}).count();
    if(activeCountNow !== activeCount) {
        activeCount = activeCountNow;
        activeDep.changed();
    }
});

Deps.autorun(function(){
    activeDep.depend();
    Meteor.subscribe('items', new Date().getTime());
});

サーバ:

Meteor.publish('items', function(timestamp) {
    var t = timestamp;
    return Item.find({categoryId: Categories.find({active: true} });
});
于 2013-07-27T22:18:44.110 に答える