2014-09-13 96 views
0

我使用鐵路路由器的waitOn功能訂閱集合。此訂閱取決於Session變量。當Session變量發生更改時,應使用Session變量的新值更新訂閱。鐵路路由器:如果等待更改,不要重新渲染頁面

這工作正常,但有一個問題:當會話變量更改時,頁面會完成重新渲染。但是,我只是想要改變數據。

難道在某種程度上可以避免這種重新渲染行爲,只是在Session變量發生變化時重新訂閱?

謝謝

託尼

+0

嗨,也許這可以幫助你https://github.com/EventedMind/iron-router/blob/devel/examples/waiton/waiton.js – 2014-09-13 20:19:42

+0

謝謝你的評論,但這並沒有真正解決這個問題我有 – tomet 2014-09-13 20:22:06

回答

1

waitOn在計算中被調用並使其無效(例如,當Session變量發生變化時)將導致您的路由控制器重新計算一切。所以基本上,您只應根據來自this.params對象的數據在waitOn之內訂閱。這就是它的設計目的。

如果你想要另一種行爲,並使你的訂閱參數依賴於某些會話變量,那麼它可能與路由器沒有任何關係。在這種情況下,您應該使用Deps.autorun模式,如您在答案中所述。

0

顯然,我想什麼是不可能的。我找到的解決方案如下:

而不是訂閱使用waitOn,我在Template.rendered回調Deps.autorun中訂閱。

0

你想要的只是等待第一次訂閱。要做到這一點,您需要在非反應範圍內訂閱。要在被動範圍內達到非反應範圍,您需要使用Tracker.nonreactive(功能)http://docs.meteor.com/#/full/tracker_nonreactive這樣做會使您無需重新訂閱即可訪問所需的值。在這種情況下,我會使用路由方法:

請注意,這是未經測試的代碼,我放在一起。隨意修改和調整。

Router.route('/path/:param', function(){ 
    var self = this; 
    var computation, subscription; 
    Tracker.autorun(function(){ 
     if (!computation) 
      computation = Tracker.currentComputation; 
     if (!subscription) 
      Tracker.nonreactive(function(){ 
       subscription = self.subscribe('subscription', /*reactive var here */); 
       computation.invalidate(); 
      }); 
     if (subscription && subscription.ready()){ 
      self.render('templateName'); 
      self.subscribe('subscription', /*reactive var here */); 
     } 
    }); 
}); 

有點在做什麼。這是對可以隨意重新運行的路線進行嵌套計算,其中一些全局變量用於跟蹤計算和我們不希望處理的訂閱變化。我們訂閱了兩次訂閱,一次處於非響應狀態,其中更改不會影響訂閱。這是我們用來計算是否渲染的一個。然後,我們會在訂閱準備就緒時提交,並在此時重新訂閱一個被動變量。流星很聰明,因爲它認識到新訂閱與舊訂閱相同,只會根據它更新minimongo記錄。這可以有效地進行無縫重繪。最後是compute.invalidate,它導致內部計算現在重新運行,因爲這是訂閱(使得訂閱的存在反應而訂閱本身不響應)。