2013-02-07 49 views
1

我們使用Meteor.autorun查找'filters'會話變量中的更改,對服務器進行兩次異步調用以獲取過濾的數據,並使用結果更新兩個'list'會話變量。在另一個.autorun函數中,腳本等待列表會話變量的更改,然後打開適用的模板。可能從Meteor.autorun中排除依賴關係嗎?

所以,

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函數運行兩次,因爲它顯然仍依賴Session.get(「過濾器」)。所以在任何自動運行函數中,看起來你都不能使用與你正在觀察的變化分開的Session.get()函數。

有沒有辦法解決這個問題?

非常感謝您的幫助。

回答

3

有兩個獨立的原因,更改filters調用render_templates。一個是render_templates在與Session.get('filters')相同的自動運行中被調用;另一個是render_templates本身調用Session.get('filters')

要解決前,分裂自動運行分爲兩個獨立的自動運行:

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

要解決後者,或許移動「街區」現場出Session.get('filters')到自己的會議現場?

+0

嘿感謝您的回答。 –

+0

我避免了創建多個過濾器會話變量,以便可以使用一個Session.set重置或更新整個過濾器。我最終將篩選器作爲「獎項」和「場所」會話變量中的單獨屬性。創建單獨的Meteor.autorun函數運行良好。不確定其他人是否也有類似的挑戰,但它能夠隔離依賴關係可能是有用的。你們這些人用流星來做很棒的事情,互聯網已經是一個更好的工作場所。 –

+0

是的,現在分離依賴關係的最簡單方法是將它們放在單獨的Session變量中:)也可以直接使用Context或ContextSet來創建自己的反應數據結構;會話只是完成最直接的反應任務所提供的最簡單的方法。 –

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") + "!"); 
}); 
相關問題