Meteor:将对象存储在rendered()中,以便在子助手中使用

Meteor:将对象存储在rendered()中,以便在子助手中使用,meteor,meteor-blaze,Meteor,Meteor Blaze,我想存储在Template.myTemplate.rendered=function(){…}期间创建的对象,并在Template.myChildTemplate.helpers(helpers)中使用该对象。到目前为止,我使用的是全局对象,但这感觉非常粗糙。有没有一种以模板为中心的好方法呢?不幸的是,目前还没有这样的方法 常见的模式是将reactive dict用作文件范围的变量,或者如果需要访问多个文件,则在与模板相关的命名空间中使用。此解决方案的缺点是,此变量在同一模板的所有实例之间共享,

我想存储在
Template.myTemplate.rendered=function(){…}
期间创建的对象,并在
Template.myChildTemplate.helpers(helpers)
中使用该对象。到目前为止,我使用的是全局对象,但这感觉非常粗糙。有没有一种以模板为中心的好方法呢?

不幸的是,目前还没有这样的方法

常见的模式是将reactive dict用作文件范围的变量,或者如果需要访问多个文件,则在与模板相关的命名空间中使用。此解决方案的缺点是,此变量在同一模板的所有实例之间共享,因此如果在多个位置渲染此模板,则必须解决此问题

var data = new ReactiveDict();

Template.myTemplate.rendered = function() {
  data.set('key', 'value');
};

您可以使用
UI.\u templateInstance()
ReactiveDict
(使您的数据也具有反应性)(添加了
meteor添加反应性dict

Template.myTemplate.created = function() {
    this.templatedata = new ReactiveDict();

}
Template.myTemplate.rendered = function() {
    this.templatedata.set("myname", "value";
};

Template.myTemplate.helpers({
    myvalue: function() {
        var tmpl = UI._templateInstance();
        return tmpl.templatedata.get('myname');
    }
});
这将允许您在页面上多次使用此模板,并且每个模板都有一个变量范围,这是全局变量或非实例变量所不允许的


需要注意的是,当前的iron路由器(0.7.1)会破坏
UI。_templateInstance();
,这是目前的一个问题。

在重新提交过程中是
templatedata
持久吗?如果模板被破坏,变量也会被破坏。我不确定blaze是否会重新呈现模板。如果模板内容(dom/或helper值)更改它将保持不变,尽管如此。我想知道这与什么有关,文档仍然将其标记为只读,并在重新渲染时更新。过去,如果避免重新渲染模板,我使用它成功地存储本地数据。哦,我明白你现在的意思了。
this.data
随着父模板的数据上下文的更改而更改,因此你可以更改只要父模板不更改其数据,它就会保存下来。这基本上是将数据存储在模板的实例中,只要它是活动的,您就可以访问它并在其上设置内容(包括如果有多个模板),如果数据上下文发生变化,数据也将保持不变。我迫不及待地想使用它,我的应用程序到处都是per template
Deps.autorun
之类的东西,这将为我清理很多。我只是在等待iron router为感兴趣的人提供支持,我写了一篇博客文章,详细介绍了阿克沙在下面的回答中描述的技术。