1

Meteor.autorunを使用して、「filters」セッション変数の変更を検索し、フィルター処理されたデータに対してサーバーに対して2つの非同期呼び出しを行い、2つの「list」セッション変数を結果で更新します。別の.autorun関数では、スクリプトはリストSession変数の変更を待機してから、該当するテンプレートをオンにします。

それで、

Meteor.autorun(function(){

    set_search_session(Session.get('filters'));

    render_templates(
         Session.get('places'),
         Session.get('awards')
    );

});

var set_search_session = function(filters) {
      Meteor.call('search_places', filters.places, function(error, data) {
          Session.set('places', data);
      };
      Meteor.call('search_awards', filters.awards, function(error, data) {
          Session.set('awards', data);
      };
};

var render_templates = function(places, awards) {
      var filters = Session.get('filters');
      if (!awards && _.isUndefined(filters['neighborhood'])) {
           Session.set('template', 'place_detail');
      };
};

問題は、render_templates関数が2回実行されることです。これは、明らかにまだSession.get('filters')に依存しているためです。したがって、どの自動実行関数でも、変更を監視している関数とは別のSession.get()関数を使用できないように見えます。

これを回避する方法はありますか?

どうもありがとうございました。

4

2 に答える 2

3

filters呼び出しを変更する理由は2つありますrender_templates。1つは、 ;render_templatesと同じ自動実行内で呼び出されることです。Session.get('filters')もう1つは、render_templatesそれ自体がを呼び出すことSession.get('filters')です。

前者を修正するには、自動実行を2つの別々の自動実行に分割します。

Meteor.autorun(function(){
    set_search_session(Session.get('filters'));
});
Meteor.autorun(function(){
    render_templates(
         Session.get('places'),
         Session.get('awards')
    );    
});

後者を修正するには、おそらく「近隣」フィールドをSession.get('filters')独自のセッションフィールドに移動しますか?

于 2013-02-07T21:46:09.590 に答える
0

ここでゲームに遅れるかもしれませんが、同じ問題が発生しました(リアクティブ変数が変更されたときに現在のユーザーを変更する必要がありましたが、ユーザーが変更されたときではなく、自動実行内でMeteor.user()を使用していました)。

答えはトラッカーマニュアルから来ました:https ://github.com/meteor/meteor/wiki/Tracker-Manual#ignoring-changes-to-certain-reactive-values

Tracker.autorun(function () {
    Tracker.nonreactive(function () {
        console.log("DEBUG: current game umpire is " + game.get("umpire"));
    });
    console.log("The game score is now " + game.get("score") + "!");
});
于 2015-08-28T16:06:06.097 に答える