2017-05-22 5 views
2

クライアントサイドのMeteorアプリでいくつかの値を更新する際に問題があります。 ReactiveVarの仕組みを理解しようとしています。 クライアントサイドのコレクションでfind()メソッドを使用すると、何か変更するたびにサイトが直ちに更新されます。 ReactiveVarとサーバーサイドメソッドを使用して同じ効果を得たいと思います。サーバと反応するvarを更新する方法

// Client 
Template.body.onCreated(function appBodyOnCreated() { 
    this.subscribe('activities'); 
} 

Template.body.helpers({ 
    getCounter() { 
    return Activities.find({ 
     editorId: Meteor.userId(), 
     'referredObject.type': 'LIST' 
    }).count(); 
} 
}); 

をしかし、私は、サーバー側のメソッドと同じ効果を達成しようとすると、それが正常に動作しません。だから、以下のコードは、私のために正しく動作します。以下のコードは一度だけ変更可能です。現在の値を取得したい場合は、ページを更新する必要があります。私は常に(最初のクライアント側のみの例のように)変数の現在の値を持っているしたい場合、私は私のコードを向上させることができますどのように

// Server 
Meteor.methods({'activitiesCreateCount'(userId, objectType) { 
    check(userId, String); 
    check(objectType, String); 
    return Activities.find({ 
     editorId: userId, 
     'referredObject.type': objectType 
    }).count(); 
} 
}); 

// Client 

Template.body.onCreated(function appBodyOnCreated() { 
    this.subscribe('activities'); 
    this.activitiesAmount = new ReactiveVar(false); 
} 

Template.body.helpers({ 
    getCounter() { 
    var tempInstance = Template.instance(); 
    Meteor.call('activitiesCreateCount', Meteor.userId(), 'TODO', function(err, response) { 
     tempInstance.activitiesAmount.set(response); 
    }); 
    return Template.instance().activitiesAmount.get(); 
} 
}); 

+0

ようTemplate.body.onCreated 何かにMeteor.callを移動するようにしてください。あなたが働くソリューションを持っているなら、なぜそれを使いたくないのですか? –

+0

私は複雑で時間のかかる作業があるとします。あるユーザーが何かを変更すると、この複雑なタスクがトリガーされ、その結果が別の特定のユーザー画面で更新されるはずです。クライアント側でこの複雑なタスクを実行することをお勧めしますか?私は別の解決策を探しています。 – zis7

+0

この「想像上の "複雑で時間のかかる作業"が一部の文書の一部の値を変更した場合、それを購読するだけで常に最新の状態に保ちます。クライアントに送信されるデータの量を減らすには 'fields'を使います。 –

答えて

-2

は、動作するようになっていますとそれが動作するこの

// Server 
    Meteor.methods({'activitiesCreateCount'(userId, objectType) { 
     check(userId, String); 
     check(objectType, String); 
     return Activities.find({ 
      editorId: userId, 
      'referredObject.type': objectType 
     }).count(); 
    } 
    }); 

    // Client 

    Template.body.onCreated(function appBodyOnCreated() {   
    self = this; 
    this.activitiesAmount = new ReactiveVar(false); 
    Meteor.call('activitiesCreateCount', Meteor.userId(), 'TODO', function(err, response) { 
     self.activitiesAmount.set(response); 
    }); 
    } 

    Template.body.helpers({ 
    getCounter() { 
     return Template.instance().activitiesAmount.get(); 
    } 
    }); 
+0

どちらも一度だけ実行されます。 –

関連する問題