web-dev-qa-db-ja.com

ハンドルバーでオプションハッシュ内にヘルパーをネストすることは可能ですか?

たとえば、「i18n」ヘルパーを別のヘルパーのハッシュ変数内にネストする方法はありますか?

{{view "SearchView" placeholder="{{t 'search.root'}}" ref="search" url="/pages/search" className='home-search'  polyfill=true}}
47
mateusmaso

Update:Handlebarsが subexpressions をサポートするようになりました。

{{view "SearchView" (t 'search.root')}}
79
Kevin Borders

シナリオは直接サポートされていませんが、使用できる回避策がいくつかあります。ハンドルバーヘルパーは単なる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);

そして、引数としてi18nキーを渡すだけです:

{{view placeholder="search.root"}}

ヘルパーがどの引数をローカライズすべきか、そしてどの引数をローカライズすべきでないかを知っている限り、これは素晴らしいことです。それが不可能な場合は、ハンドルバー式が含まれている場合、すべてのヘルパー引数をハンドルバーで実行してみてください。

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);
}

そして、説明したネストされたテンプレート構文を使用します。

{{view placeholder="{{t 'search.root'}}" }}

これらのオプションはどちらも完璧ではありませんが、私が考えることができる最高のものです。

11
jevakallio