2015-10-12 24 views
0

我在模板A中有一個選擇框,用於選擇項目「名稱和ID」。在選擇框更改時使用新ID重新初始化模板

我也有一個「item」模板,需要一個ID作爲參數從它的數據庫加載其數據。我使用會話變量作爲id,並使用return Session.get將id傳遞給「item」模板。這僅適用於加載。會話變量更改「項目」模板時未更新。我如何獲得「項目」模板重新初始化

一些代碼:

Template.selectBox.helpers({ 
    selectList: function() { 
     return Templates.find({}, {fields: {'_id': 1, 'name': 1}}); 
    }, 
    selectedId: function() { 
     return Session.get("selectedId"); 
    } 
}); 

Template.selectBox.events({ 
    'change #item-chooser': function (event) { 
     var selectedId = $(event.currentTarget).find(":selected").val(); 
     if (typeof(selectedId) === 'undefined' 
      || selectedId === "new") { 
      Session.set("selectedId", "new"); 
     } 
     else { 
      Session.set("selectedId", selectedId); 
     } 
    } 
}); 

的項目模板使用

 {{> item selectedId}} 

Template.item.onCreated(function() { 
    var selectedId = this.data.selectedId; 
    this.selectedItem = new ReactiveVar; 
    if (typeof(selectedId) === 'undefined' 
     || selectedId === "new") { 
     this.selectedItem.set(emptyItem); 
    } 
    else { 
     var selectedItemData = Templates.findOne({_id: selectedId}); 
     this.selectedItem.set(selectedItemData); 
    } 
}); 

回答

1

值得注意的是,Template.onCreated方法不是很重要的稱爲所以如果你有反應變量,這種方法不會自動重新運行,當一個無功數據源變化不像Template.helpers

e解決您的問題asiest方式是使用autorun

Template.item.onCreated(function(){ 
    var self = this; 
    self.autorun(function(){ 
     // some code that has a reactive data source (e.g. Session Var, Collection, or Reactive Var 
     // NOTE: you can access template instance data using self.data 
    }); 
}); 

然而,根據您的描述,我覺得有可能是一個更好的方式使用來處理你的問題Template.helpers

Template.item.helpers({ 
    selectedItem: function(){ 
     return Templates.findOne({_id: Session.get("selectedId")}); 
    } 
}); 
+0

你是事業權。我一直在嘗試會話,reactivevar只是爲了嘗試差異,但你的幫手方法似乎是最合適的。謝謝 – Todilo