【发布时间】:2014-03-13 05:45:36
【问题描述】:
这就是我想要的,一个可以像模板一样工作的自定义块助手,监视它自己的事件等。html 看起来像这样:
{{#expandable}}
{{#if expanded}}
Content!!!
<div id="toggle-area"></div>
{{else}}
<div id="toggle-area"></div>
{{/if}}
{{/expandable}}
这是我整理的一些 javascript。如果我只是将上述内容声明为模板,这将起作用,但我希望它适用于为 expandable 块助手提供的任何输入。
Template.expandableView.created = function() {
this.data._isExpanded = false;
this.data._isExpandedDep = new Deps.Dependency();
}
Template.expandableView.events({
'click .toggle-area': function(e, t) {
t.data._isExpanded = !t.data._isExpanded;
t.data._isExpandedDep.changed();
}
});
Template.expandableView.expanded = function() {
this._isExpandedDep.depend();
return this._isExpanded;
};
我知道我可以使用如下语法声明块助手:
Handlebars.registerHelper('expandable', function() {
var contents = options.fn(this);
// boring block helper that unconditionally returns the content
return contents;
});
但这不会有模板行为。
提前致谢!对于当前的 Meteor 实现来说,这可能是不可能的。
更新
HubertOG 给出的实现非常酷,但是无法从下面的content内访问 expanded 助手:
<template name="expandableView">
{{expanded}} <!-- this works correctly -->
{{content}}
</template>
<!-- in an appropriate 'home' template -->
{{#expandable}}
{{expanded}} <!-- this doesn't work correctly. Expanded is undefined. -->
<button class="toggle-thing">Toggle</button>
{{#if expanded}}
Content is showing!
{{else}}
Nope....
{{/if}}
{{/expandable}}
在实际的块助手中,expanded 是未定义的,因为真实的东西是上下文中的一个级别。我尝试了{{../expanded}} 和{{this.expanded}} 之类的方法,但无济于事。
奇怪的是,事件处理程序已正确连接....当我单击该按钮时它会触发,但expanded 助手根本不会从content 中调用,因此即使console.log() 调用也不会触发.
【问题讨论】:
标签: meteor handlebars.js