4

この質問は、サブコンテキスト内のデータへのパスを使用して、dust.js テンプレート システムを使用することに関するものです。私の意図は、文字列へのキーのマップを使用して i18n をサポートすることです。

次のようなデータが与えられた場合:

{i18n : { firstname : "First Name" },
 people : [
    {"name" : "Moe"},
    {"name" : "Curly"}
 ]}

ほこりでは、セクションを使用して各人物をリストできます。

{#people}
    {name}
{/people}

また、パスを使用して firstname i18n 文字列にアクセスできます。

{i18n.firstname}

しかし、以下は機能しません。

{#people}
    {i18n.firstname}: {name}
{/people}

実際、ドキュメントには具体的に次のように記載されています。

脆弱で紛らわしい参照を避けるために、パスはコンテキスト スタックを逆戻りすることはありません。親コンテキスト内で使用可能なキーにドリルダウンする必要がある場合は、キーをパラメーターとして渡します。

そのため、キーをパラメーターとして渡してみます。

{#people i18n=i18n}
    {i18n.firstname}: {name}
{/people}

しかし、これはうまくいきません。ダストホームページでこれを試してみると、コンパイルされたテンプレートに次のコードが含まれていることがわかります。

"i18n": ctx.get("i18n")

これにより、上記の例はうまくいくはずだと思います。

それで、何が得られますか?どうすればこれを機能させることができますか?

注:以下機能します。

{#people firstname=i18n.firstname}
    {firstname}: {name}
{/people}

しかし、ピープルコンテキスト内で多数の i18n キーにアクセスする必要がある場合、これはうまく機能しません。

4

2 に答える 2

5

キーとセクションでパスを使用して、Dust がキーを探す場所を指定できます。パスをいつ、どのように使用するかを理解するには、まず、パスがない場合に Dust がどのようにキーを探すかを理解する必要があります。座りたくなるかもしれません。

キーを検索するとき、Dust はまず現在のコンテキストを調べ、次に検索する親がなくなるまで各親コンテキストを調べます。キーが見つからない場合、Dust は何もしません (Exists または Not Exists セクションを使用していない限り)。 . キーが見つかった場合、Dust は検索を停止し、指定された値を使用します。それはあまりにも異質ではありませんよね?これが、JavaScript が実行環境で変数を探す方法です。

ただし、パスが使用されている場合、Dust はルートに向かってツリーを見上げるのではなく、子のみを見ます。これは、例で最もよく説明されています。

JSON:

{
  "i18n": {
    "firstname": "First Name"
  },
  "name": "My Dust Template",
  "firstname": "Surprise!",
  "people": [
    {
      "name": {
        "firstname": "Moe",
        "lastname": "Howard"
      }
    },
    {
      "name": {
        "firstname": "Curly",
        "lastname": "Howard"
      }
    }
  ]
}

そしてダスト:

Dust Template:

{! Show the name of the template !}
{name}{~n}
{#people}

  {! 
     As you noted, the following will not work, because 
     when using a path, Dust only searches
     deeper into the JSON. The output will be:
     ": Surprise!"
  !}
  {i18n.firstname}: {firstname}{~n}

  {!
     To get your i18n string, you need to look up the 
     stack instead of down. This can be done by using a
     section without a path, as follows. The output will be:
     "First Name: Moe"
     "First Name: Curly"
  !}
  {#i18n}{firstname}{/i18n}: {name.firstname}{~n}

  {! 
     Note that we successfully used the path to 
     get the firstname of each of the people.
  !}
{/people}

[編集]: 詳細については、Dust の LinkedIn フォークからこの wiki ページを確認してください: https://github.com/linkedin/dustjs/wiki/Where-else-does-Dust-search-if-the-value- is-not-defined%3F-AKA-Dust-Scoping

于 2012-08-08T18:37:36.260 に答える
3

これがテンプレートの場合:

{#people i18n=i18n}
  {i18n.firstname}: {name}
{/people}

'name'配列を反復処理するときのコンテキストスタックは次のようになります

{ your original context}
i18n -> firstname: "First Name"
name -> "Moe" 

パラメータを定義すると、定義したすべてのパラメータがダストによってコンテキストスタックにプッシュされます。次に、コンテキスト内で配列が見つかると、ダストがスタックに1つずつ、配列内のすべてのアイテムをプッシュします。

したがって、セクション内でパスコンテキストを定義すると、パラメータとしてi18nを渡した場合でも、i18nコンテキストはコンテキストスタックに残り、{i18nのようなパスを使用してi18nにアクセスしようとします。ファーストネーム}、dustはそれを見つけられず、それを見つけるためにバックトラックする必要があり、getPathはバックトラックを行いません。一方、getメソッドはバックトラックを実行するため、これを行うと次のようになります。

{#people firstname=i18n.firstname}
  {firstname}: {name}
{/people}

getメソッドを使用してセクション内の名にアクセスしているため、機能します。私が言おうとしていることをあなたが理解してくれることを願っています。

私がすることは、次のようなセクションを取り込むヘルパーメソッドを定義することです。

{#people}
  {#i18n}{firstname}{/i18n}: {name}{~n}
{/people}

そして、次のように、コンテキストでメソッドを定義します(または、[makeBaseで定義された]グローバルコンテキストにプッシュして、グローバルヘルパーにします)。

i18n: function(chunk, context, bodies, params){
  var trans = context.get(translation); //or whatever name you give to your i18n list
  chunk.render(bodies.block, context.push(trans));
  return chunk;
}

ほこりのウェブサイトでこれをテストし、それは動作します。このアプローチの利点は、セクションの範囲内でi18n出力をフォーマットできることです。また、グローバルコンテキストでヘルパーとi18nリストの両方を定義するとよいので、そのためにmakeBaseを使用してください。ではごきげんよう。

于 2012-08-08T12:54:04.460 に答える