Handlebars.js: テンプレートから変数のリストを取得する方法は?

作成日 2016年04月07日  ·  15コメント  ·  ソース: handlebars-lang/handlebars.js

皆さんこんにちは、

テンプレートで使用されている変数のリストを取得する方法はありますか? テンプレートに{{varName}}場合、それを知りたいのですが。 テンプレートに次のようなものがある場合

{{#each listName}}
    {{field1}}
    {{field2}}
{{/each}}

テンプレートには、フィールドfield1field2持つオブジェクトを含むlistNameというリストが必要です。 このためのAPIはありますか?

ありがとう、
ドミトリー。

最も参考になるコメント

このスレッドを見つけた人のために、私は含まれている変数をチェックするために素早く汚い方法を使用しました

const getHBVars = value => {
  const ast = hb.parse(value)
  let keys = {}

  for (let i in ast.body) {
    if (ast.body[i].type === 'MustacheStatement') {
        keys[ast.body[i].path.original] = true
    }
  }
  return keys
}

const activeKeys = getHBVars('Hello {{person}}! Today is {{day}}')

console.log(activeKeys)
// --> { person: true, day: true }

全てのコメント15件

探しているものに最も近いのは、ログヘルパーを使用して特定のコンテキスト(テンプレート変数のセット)を出力することです。

例: {{log this}} - thisオブジェクトをコンソールに出力するので、使用可能なプロパティ(および値)を確認できます。

thingsセットがあることがわかっていて、それらを具体的に出力したい場合は、代わりに{{log things}}実行できます。 それは、他のブログ内でifまたはeachなどで機能します。

ドキュメントはここにあります: http

入力を検証するためにHandlebarsテンプレートからJSONスキーマのようなものを構築する方法を探していますか? それは不可能だと思います。 任意のブロックヘルパーを作成できるため、ヘルパーブロック内のコンテキストが実際にどのようになるか、およびこのヘルパーに期待されるサブオブジェクトがどのように見えるかを確認することはできません。

独自のhelperMissingヘルパーを使用してテンプレートをコンパイルして、使用済み変数の収集に役立てることができます(null入力でレンダリングする必要がある場合があります)。 ただし、前のコメントで述べたように、テンプレートが異なるコンテキストに対して動作すると、異なる結果が得られる可能性があります。

答えてくれてありがとう。

はい、入力を検証するためにテンプレートからJSONスキーマのようなものを構築しようとしています。 私はそれが一般的に不可能であることを知っています。 しかし、私が書いた標準のヘルパーとヘルパー( knownHelpersOnly )のみを使用する場合、固有の克服できない問題は見られません。

私はハンドルバーがそうするための「標準的な」(低レベルではあるが)方法を提供するかもしれないと思った。 たとえば、ヘルパーが入力として何を期待しているのかを世界に伝えるためのAPI、またはこのようなものです。 あなたの答えから判断すると、そのような方法はありません。

これを機能リクエストと見なしてほしい:)

@dsavenkoテンプレートを解析して、ASTをスキャンできます。 この手法は、ASTで部分ノードを検索することにより、このrequirejsプラグインに部分をプリロードするために使用されます。
https://github.com/SlexAxton/require-handlebars-plugin/blob/master/hbs.js#L224

ここにAST構造に関するドキュメントがあります:
https://github.com/wycats/handlebars.js/blob/master/docs/compiler-api.md

@jbboehrありがとう、これは有望に見えます!

@dsavenko私はこれを自分で見たいです。 タイプチェックをポートに統合する方法を探していましたが、テンプレートスキーマが役立つようです。

これに対する解決策を見つけましたか?
これがありますが、私はそれを機能させることができませんでした:

https://github.com/stevenvachon/handlebars-html-parser

@abumalick 、いや、私はしませんでした。 AST解析アプローチが機能する可能性があります。 しかし、この機能を必要としない方法でフローを再設計する方が簡単でした。

このスレッドを見つけた人のために、私は含まれている変数をチェックするために素早く汚い方法を使用しました

const getHBVars = value => {
  const ast = hb.parse(value)
  let keys = {}

  for (let i in ast.body) {
    if (ast.body[i].type === 'MustacheStatement') {
        keys[ast.body[i].path.original] = true
    }
  }
  return keys
}

const activeKeys = getHBVars('Hello {{person}}! Today is {{day}}')

console.log(activeKeys)
// --> { person: true, day: true }

...しかし、より高速な方法は、おそらく生のコンテンツに正規表現を使用することです。

/{{[{]?(.*?)[}]?}}/g

https://gist.github.com/etiennemarais/2597e33168a07a16a5d541db2a991005

私は数年前にBarhandlesを作成しました。 確かに完璧ではありませんが、正規表現の解析よりはましです。 ハンドルバーテンプレートをフィードするだけで、ASTを使用して変数参照を検索します。

http://nxt.flotsam.nl/barhandles
https://medium.com/east-pole/advanced-barhandles-4a7e64c1bc0d
https://github.com/wspringer/barhandles

非アクティブのために閉じます。

@wspringerあなたは男です!

これは古いことは知っていますが、以下の要点でこれを達成することができ、他の人にも役立つかもしれないと思いました。 それはまだ開発中ですが、私はそれからいくらかの成功を得ています。 エラーに気づいたらコメントとして残してください。

https://gist.github.com/imryanjay/1d91b2c9f768af7c1b1877a51a4a75f0

このページは役に立ちましたか?
0 / 5 - 0 評価