在selectbox更改时使用新ID重新初始化模板

时间:2015-10-12 19:13:06

标签: meteor meteor-blaze

我在模板A中有一个选择框,用于选择一个项目" name和id"。

我还有一个"项目"需要ID作为参数的模板,以从其数据库加载其数据。我正在为id使用会话变量,并将id传递给" item"使用返回Session.get的模板。这仅适用于负载。当会话变量改变"项目"模板未更新。我如何获得"项目"模板重新初始化

一些代码:

 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 个答案:

答案 0 :(得分:1)

值得注意的是,Template.onCreated方法不具有反应性,因此如果您有反应变量,当反应数据源发生变化时,此方法不会自动重新运行Template.helpers < / p>

解决问题的最简单方法是使用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")});
    }
});