0

Dust.jsで変数の間接化を実現することは可能ですか?したがって、マップのような機能を使用できますか?

Dust に渡す次のコンテキストがあるとします。

{
  "keys": [ "Foo", "Bar", "Baz" ],
  "data": [{
      "date": "20130101",
      "values": {
        "Foo": 1,
        "Bar": 2,
        "Baz": 3
      }
    }, {
      "date": "20130102",
      "values": {
        "Foo": 4,
        "Bar": 5,
        "Baz": 6
      }
    }]
}

そして、次の出力を実現したいと考えています(実際にはテーブルになりますが<tr><td>、簡潔にするためにタグをスキップし、スペースと改行に置き換えました):

Date Foo Bar Baz
20130101 1 2 3
20130102 4 5 6

keysプロパティをループして、各値xを使用して検索する方法がわかりませんdata[i].values[x]。キーをハードコーディングすることで、目的の出力を取得できます。

Date{~s}
{#keys}
  {.}{~s}
{/keys}
{~n}
{#data}
  {date}{~s}
  {values.Foo}{~s}
  {values.Bar}{~s}
  {values.Baz}{~s}
  {~n}
{/data}

ただし、キーは動的に決定されるため、テンプレートにハードコードすることはできません。などの行を次のようなものに置き換える方法はありvalues.Fooますか:

{#data}
  {date}{~s}
  {#keys outerMap=values}
    {outerMap.{.}}{~s}
  {/keys}
  {~n}
{/data}

これは書かれているようには機能しません。(現在のキーの値)の出力をキャプチャし、{.}解決するプロパティ名 (の一部) として動的に使用できますか?

4

2 に答える 2

2

smfoote が言うように、これはすぐに使用できる Dust ではサポートされていません。

ただし、ハンドラーにはいくつかのロジック要素が含まれている可能性があるため、逆参照を行うハンドラーを作成するのは比較的簡単でした。

  deref: function(chunk, context, bodies, params) {
    chunk.write(params.obj[params.prop]);
  }

このハンドラーはobj、連想配列として使用するオブジェクトである引数を取ります。そして、propそのオブジェクトから検索するキーを記述するパラメーター。このハンドラー関数をコンテキストに追加すると、テンプレートのデータ部分を次のように記述できます。

{#data}
  {date}{~s}
  {#keys}
    {#deref obj=values prop=./}{~s}
  {/keys}
  {~n}
{/data}

これにより、すべてのキーを反復処理し、オブジェクトから読み取るプロパティとして渡すことで、正しい出力が生成されvaluesます。

Dust の哲学を考えると、これが不適切であると考える人もいるかもしれません。ただし、特に複雑なロジックを構成しているとは思いません。実際、これはテンプレート フレームワークの一部である可能性が非常に高いものです。JSON を更新するという smfoote の提案された代替案がオプションではないことを考えると (テンプレートは事前にキーが何であるかを知らないため、ここに「静的な」参照を記述する方法はありません)、これは妥当なアプローチのように思えます。

于 2013-01-23T15:23:12.250 に答える
2

したがって、短い答えはノーです。Dust ではそれを行うことはできません。

Dust は論理のない言語であることを意図しており、これはあまりにも多くの論理に接しています。一般に、このような問題に対する答えは JSON を更新して、Dust で正しく動作するようにすることです。これは、あなたが示した例では簡単に実行できますが、実際の状況でははるかに困難になる可能性があります. ダストの力の一部は、その制限にあります。

この回答がうまくいかない場合は、GitHub でプル リクエストを送信してください: https://github.com/linkedin/dustjs

于 2013-01-22T18:45:17.757 に答える