我刚刚开始使用把手,并且您不能在模板中使用Js,因此您必须使用helpers(?),否则我就相信了自己。
我想基于URL哈希更改表达式。
所以,如果我的网址是www.mysite.com/template.html#new
我想#each
是{{#each New}}
,如果这是/template.html#anythingelse
我希望它改变{{#each anythingelse}}
我知道我可以使用哈希,var hash = window.location.hash;
并且通常可以使用哈希,+hash+
但是使用把手我不太了解吗?
而且我知道可能不太好,因为用户可以输入#whattheywant,但与我的使用方式无关紧要。
<ul>
{{#each New}}
{{#each genres}}
<li>{{genre-name}}
<ul style="list-style-type:none">
{{#each list}}
<li>{{name}}</li>
{{/each}}
</ul>
</li>
{{/each}}
{{/each}}
</ul>
{{/each}}
任何帮助或见识将是惊人的。
和往常一样,有几种方法可以做到这一点。
我认为在这里必须有自己的书面帮助者。让我们将其命名为customEach。进一步,让我们templateName
成为模板的名称。对于此解决方案,我们必须确保将所有数组都传递给Handlebars。在作者的示例中,这将是一个名为new的数组和一个名为anyelse的数组。
因此,Handlebars调用将类似于:
var ctx = {
new: new,
anythingelse: anythingelse
};
Handlebars.templates["templateName"](ctx);
定制块帮助程序“ customEach”可能类似于以下内容:
Handlebars.registerHelper('customEach', function(options) {
var hash = window.location.hash.substr(1);
return options.fn(this[hash]);
});
请注意,在一个助手(仅是一些JS代码)中,确实可以访问URL的哈希组件。
Handlebars插件传递给我们的助手的options参数包含一个名为fn的函数。它的行为就像一个普通的编译模板。因此,只需将所需的数组传递给它(this
保存当前上下文,该上下文与ctx
我们之前传递给Handlebars的变量相对应)。换句话说,fn
仅处理{{#customEach}}
和之间定义的内容{{/customEach}}
。
新模板将是:
<ul>
{{#customEach}}
{{#each genres}}
<li>{{genre-name}}
<ul style="list-style-type:none">
{{#each list}}
<li>{{name}}</li>
{{/each}}
</ul>
</li>
{{/each}}
{{/customEach}}
</ul>
当然,这里应该执行一些错误处理,例如,如果在我们的原始上下文中未定义特定的哈希值#anythewant。
我还没有测试我的代码。但是,即使它失败了,我希望它背后的想法是明确的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句