是否可以使用把手将助手嵌套在选项哈希中?

mat*_*aso 47 templates helpers backbone.js handlebars.js

例如,有没有办法将我的" i18n "助手嵌套在另一个助手的哈希变量中?

{{view "SearchView" placeholder="{{t 'search.root'}}" ref="search" url="/pages/search" className='home-search'  polyfill=true}}
Run Code Online (Sandbox Code Playgroud)

Kev*_*ers 79

更新: Handlebars现在支持子表达式,因此您可以执行以下操作:

{{view "SearchView" (t 'search.root')}}
Run Code Online (Sandbox Code Playgroud)

  • 这是正确的(并且更好)答案.谢谢! (2认同)

jev*_*lio 11

您的方案不是直接支持的,但您可以使用几种解决方法.把手助手只是javascript代码,因此您可以从助手代码本身执行它们:

function translateHelper() {
    //...
}

function viewHelper = function(viewName, options) {
    var hash = options.hash;
    if(hash.placeholder) { 
        hash.placeholder = translateHelper(hash.placeholder);
    }
};

Handlebars.registerHelper('view', viewHelper);
Handlebars.registerHelper('t', translateHelper);
Run Code Online (Sandbox Code Playgroud)

只需将i18n键作为参数传递:

{{view placeholder="search.root"}}
Run Code Online (Sandbox Code Playgroud)

这很好,只要你的帮助者知道哪些参数应该被本地化,哪些不是.如果这不可能,您可以尝试通过Handlebars运行所有帮助器参数,如果它们包含一个把手表达式:

function resolveNestedTemplates(hash) {
  _.each(hash, function(val, key) {
    if(_.isString(val) && val.indexOf('{{' >= 0)) {
      hash[key] = Handlebars.compile(val)();
    }
  });
  return hash;
}

function view(viewName, options) {
  var hash = resolveNestedTemplates(options.hash, this);
}
Run Code Online (Sandbox Code Playgroud)

并使用您描述的嵌套模板语法:

{{view placeholder="{{t 'search.root'}}" }}
Run Code Online (Sandbox Code Playgroud)

我发现这些选项都不是完美的,但它们是我能想到的最好的选择.