根据 url 散列更改表达式 - handlebars.js

Change expression based on url hash - handlebars.js

我刚开始使用 handlebars,你不能将 Js 与模板一起使用,所以你必须使用 helpers(?) 左右我让自己相信。

我想根据 URL 哈希更改我的表达式。

所以如果我的 URL 是 www.mysite.com/template.html#new 我希望 #each{{#each New}} 如果它是 /template.html#anythingelse 我希望它更改为 {{#each anythingelse}}

我知道我可以使用 var hash = window.location.hash; 获取哈希值,并且通常将其与 +hash+ 一起使用,但据我所知我不能使用车把?

我知道这可能不太好,因为用户可以输入#anythingtheywant,但这与我使用它的方式无关。

    <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 的数组和一个名为 anythingelse 的数组。

因此 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 插件传递给我们的助手的选项参数包含一个名为 fn 的函数。它表现为一个普通的编译模板。所以只需将想要的数组传递给它(this 保存当前上下文,它对应于我们之前传递给 Handlebars 的 ctx 变量)。换句话说,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>

当然应该在这里实现一些错误处理,例如如果我们的原始上下文中未定义特定的哈希值#anythingtheywant。

我还没有测试我的代码。但即使它失败了,我希望它背后的想法是清楚的。