2015-05-06 78 views
3

我有一個關於模板訂閱的問題。我才發現,不是一個錯誤,而是一個非酷的行爲,考慮以下因素:帶參數的模板訂閱行爲

路由器(鐵路由器):

this.route('test', { 
    path '/test/:_id' 
}); 

然後模板訂閱:

Template.test.onCreated(function() { 
    this.subscribe('mydata', Router.current().params._id); 
}); 

基本路線,其中訂閱鏈接到由路由參數給定的id。

然後,如果我有兩個環節是這樣的:

<a href="/test/hello">hello</a> 
<a href="/test/hi">hello</a> 

隨着/測試/問候和/測試/ HI共享相同的模板,從測試onCreated只調用一次(同爲onRendered)。這意味着該訂閱將存在id:hello,但不適用於id:hi(因爲onCreated只會爲hello調用一次)。

我避免了使用子管理器包在路線中移動訂閱的問題。然而,我很有興趣知道如何處理模板中的這些問題(我只是更喜歡模板比路由更好地知道他需要執行什麼訂閱)。

簡而言之,如果有人沒有得到它: 兩頁,相同的路徑(帶參數),相同的模板,onCreated/onRendered只調用一次,但路由參數改變,所以它應該有兩個訂閱。但是因爲onCreated/onRendered僅被調用一次(因爲它們共享相同的模板),所以只存在一個訂閱。如何使用模板訂閱方法來處理這種情況?

回答

1

您可以在您的onCreated生命週期事件中使用反應式計算。

Template.test.onCreated(function() { 
    this.autorun(function(){ 
    var currentRouteParamId = Router.current().params._id; 
    this.subscribe('mydata', currentRouteParamId); 
    }.bind(this)); 
}); 

Router.current()是反應性的數據源,每當當前路線是通過導航改性通過this.autorun內反應性計算安裝程序將重新運行。

Tracker.autorun內的訂閱呼叫會自動停止並重新訂閱(如果參數被修改)。