Handlebars.js: 各ヘルパーの解析エラー:「ID」が必要ですが、未定義になりました

作成日 2012年06月29日  ·  6コメント  ·  ソース: handlebars-lang/handlebars.js

ドキュメントの例を試してみると、次のエラーが発生します。

キャッチされないエラー:3行目の解析エラー。
{{#each people}} ------- ^
「ID」が必要ですが、「未定義」になります

feature

最も参考になるコメント

OK、問題は実際には非常に単純で、非印刷文字とは関係ありませんが、サーバー側のテンプレートエンジンは}}の前にスペースを入れています。
以下は問題を解決しますが、{#eachpeople}}を正しく解析するためにハンドルバーを修正する必要があるかどうかはわかりません。

      source = $("#people-in-clients-template").html();
      source = source.replace(/ }}/g, "}}");
      source = source.replace(/{{ /g, "{{");

全てのコメント6件

@ustun 、これを実際に適切にデバッグする前に、もう少しコードを表示する必要があります。 このためのjsfiddleをまとめることができれば最も役に立ちます。

@wagenet迅速な対応に感謝します。 問題は、メインページの単純な#eachの例と同じであるため、デモンストレーションすらできないことです。 jsfiddleで、またはChromeコンソールでテキストを入力して試してみると、機能しますが、何らかの理由で、html()によって返されるテキストが失敗します。 どういうわけか改行で混乱しているのではないかと思います。

これがコンソールセッションです。 ご覧のとおり、テンプレートを手動で入力すると機能します。

テンプレート= $( "#people-in-clients-template")。html()
「」

{{ #each people }}
<li>{{ this }}</li>
{{ /each }}

"
t = Handlebars.compile(template);
function (context, options) {
    if (!compiled) {
      compiled = compile();
    }
    return compiled.call(this, context, options);
  }
t({"people": ['foo','bar']})
Error: Parse error on line 3: {{ #each people }}<li> ---^ Expecting 'ID', got 'undefined'

手動で試します:

template = "{{#each people }}<li>{{ this}}</li>{{/each}}"
"{{#each people }}<li>{{ this}}</li>{{/each}}"
t = Handlebars.compile(template);
function (context, options) {
    if (!compiled) {
      compiled = compile();
    }
    return compiled.call(this, context, options);
  }
t({"people": ['foo','bar']})
"<li>foo</li><li>bar</li>"

html()出力をトリミングしても効果はありません。

そう、

  template = $.trim($("#people-in-clients-template").html())
"

{{ #each people }}
<li>{{ this }}</li>
{{ /each }}

"
t = Handlebars.compile(template);
function (context, options) {
    if (!compiled) {
      compiled = compile();
    }
    return compiled.call(this, context, options);
  }
t({"people": ['foo','bar']})
Error: Parse error on line 3: {{ #each people }}<li> ---^ Expecting 'ID', got 'undefined'

テンプレートにバイナリデータがあるようです。

    template = "{{#each people }}<li>{{ this}}</li>{{/each}}"
"{{#each people }}<li>{{ this}}</li>{{/each}}"
/[\x00-\x1F]/.test(template)
false
template = $("#people-in-clients-template").html()
"

{{ #each people }}
<li>{{ this }}</li>
{{ /each }}

"
/[\x00-\x1F]/.test(template)
true

これは、問題のあるテンプレートの文字コードです。

a = [10、10、123、123、32、35、101、97、99、104、32、112、101、111、112、108、101、32、125、125、10、123、123、32 、116、104、105、115、32、125、125、10、123、123、32、47、101、97、99、104、32、125、125、10、10]

b = "";

for(i = 0; i <a.length; i ++){
b + = String.fromCharCode(a [i]);
}

t = template({"people:['foo'、 'bar']});

これがjsfiddleです:

http://jsfiddle.net/8nugY/

OK、問題は実際には非常に単純で、非印刷文字とは関係ありませんが、サーバー側のテンプレートエンジンは}}の前にスペースを入れています。
以下は問題を解決しますが、{#eachpeople}}を正しく解析するためにハンドルバーを修正する必要があるかどうかはわかりません。

      source = $("#people-in-clients-template").html();
      source = source.replace(/ }}/g, "}}");
      source = source.replace(/{{ /g, "{{");

悪いエンコーディングと実際のバグのようです。

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