我现在已经多次遇到过这种情况,我意识到我对'流星/右'处理它的方式并不十分自信。
假设我有一个包含多个部分的表单 - 每个部分由一个模板表示 - 并且在每个部分中都有更多的模板表示例如。 datepickers等。
<template name='myForm'>
{{>partOne}}
{{>partTwo}}
<button class='submit'>Submit</button>
</template>
<template name='partOne'>
{{>widget}}
{{>widget}}
</template>
<template name='widget'>
<input class='datepicker' />
</template>
我希望在用户填写表单时跟踪我的表单 - 在'myForm'模板的级别 - 但所有事件都发生在'widget'级别。
我一直看到的一个解决方案(例如in this SO answer)就是将所有内容都放在全局Session变量中。像这样
Template.widget.events({
'click .select' : function(event, template){
var name = template.data.name;
Session.set(name, $(event.currentTarget).val());
}
});
然后在myForm中我应该做这样的事情
Template.myForm.rendered = function(){
Tracker.autorun(function(){
var name = Session.get('name');
// do something
});
}
但是随着我的表单变得越来越复杂,我发现这在myForm模板级别上变得一团糟,同时用非真正应用程序全局的数据填充我的Session变量。
对于其他人如何处理这个问题,我真的很感激!保持模板和小部件模块化,同时仍然能够跟踪并响应来自父模板的触发事件......
答案 0 :(得分:3)
你并不孤单,感觉某些东西是不对的。这是关于Blaze 2的很多话题的原因之一。这就是我的工作:
创建应用全局命名空间(例如G = {}
)。我通常使用应用名称的第一个字母&amp;在lib/config/_namespace.js
将您的收藏集放在G.Collections
或G.C
,
将您的共享功能放在G.Fx
等等......
将模板变量放入G.T
。
然后,将该变量保存到G.T.varName
。这样,您就可以在rendered
以及events
和helpers
中使用它。作为一个特权,它很容易找到你所有的“全局”,因为它们都在G
对象中。此外,您现在可以再次使用“严格”。
然后,保持清洁:
Template.parentTemplate.destroyed = function() {
G.T = {};
};
因此,如果您需要反应性,只需制作ReactiveDict
:
Template.parentTemplate.created = function() {
G.T.RD = new ReactiveDict();
};
答案 1 :(得分:1)
您可以使用文件级ReactiveVar或ReactiveDict,而不是Session
对象。