【问题标题】:How to eval inside a Handlebars expression?如何在 Handlebars 表达式中进行评估?
【发布时间】:2017-05-27 03:23:28
【问题描述】:

我有一个骨干模型返回如下内容:

{
    language: "us",
    us: {
        title: "Gigs",
        subtitle: "Stay tune to my upcoming gigs"
    },
    br: {
        title: "Shows",
        subtitle: "Fique ligado na minha agenda"
    }
}

language 正在动态更新,因此它将使用 Handlebars 确定我要打印的对象。通常我会这样做:

<h1>{{title}}</h1>
<h2>{{subtitle}}</h2>

但我需要做一些连接:

<h1>{{language.title}}</h1>
<h2>{{language.subtitle}}</h2>

这当然行不通。这是我的问题:如何使表达式动态连接?

所以如果语言是"us",它会调用:

<h1>{{us.language.title}}</h1>
<h2>{{us.language.subtitle}}</h2>

如果是"br",它会调用:

<h1>{{br.language.title}}</h1>
<h2>{{br.language.subtitle}}</h2>

【问题讨论】:

  • 你可以注册一个 concat helper 比如this

标签: javascript backbone.js handlebars.js backbone-model


【解决方案1】:

从执行和良好设计的角度来看,最好的方法之一可能是在您的模型上添加一个函数

model.currentLanguage = () => model[model.language]

然后你可以在你的视图中使用它

<h1>{{currentLanguage().title}}</h1>
<h2>{{currentLanguage().subtitle}}</h2>

【讨论】:

    【解决方案2】:

    渲染时,只需使用正确的语言数据作为模板的上下文。

    this.template(this.model.get(this.model.get('language')));
    

    您也可以在模型上创建一个函数,这与 George mentioned 不同,而不是直接在上下文中。

    var LanguageModel = Backbone.Model.extend({
        /**
         * Get the translated data for the currently set language.
         * @param  {string} [lang] optional language string to override the default one
         * @return {Object} the language translation object.
         */
        getLanguageData: function(lang) {
            return this.get(lang || this.get('language'));
        },
        //...
    });
    

    现在,您只需调用该函数即可获取正确的对象。

    this.template(this.model.getLanguageData());
    

    在您的模板中,没有区别:

    <h1>{{title}}</h1>
    <h2>{{subtitle}}</h2>
    

    【讨论】:

      【解决方案3】:

      尝试在 Handlebars 中使用 with helper 以及 @George Mauer 建议的函数或本地函数,同时在模板中传递参数

      假设我们有一个返回当前语言的函数

      var lang = model[String(model.language)]; // or this, depending on where your model lives
      

      您可以在模板中传递 lang 变量(取决于您在应用程序中实现 Handlebars 模板的方式,有多种方法)

      在你的模板中

      {{#with lang}}
        <h1>{{title}}</h1>
        <h2>{{subtitle}}</h2>
      {{/with}}
      

      【讨论】:

        猜你喜欢
        • 2012-03-01
        • 1970-01-01
        • 2011-04-27
        • 1970-01-01
        • 2013-11-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-28
        相关资源
        最近更新 更多