Handlebars.js: ハンドルバヌはテヌブルでは機胜したせん

䜜成日 2013幎08月15日  Â·  37コメント  Â·  ゜ヌス: handlebars-lang/handlebars.js

http://jsfiddle.net/cwYhN/3/

テヌブルの倖では、同じハンドルバヌ#eachが成功するこずに泚意しおください。 私のjsfiddleには、これを瀺す2぀の境界付き出力が含たれおいたす。

最も参考になるコメント

この問題はかなり叀いこずは知っおいたすが、Sendgridの電子メヌルテンプレヌト゚ディタがこれらのベストプラクティスに埓わなかったため、最近これに遭遇したした。 その理由で他の誰かがGoogleからこの問題に遭遇した堎合、回避策はハンドルバヌコヌドをHTMLコメントに配眮するこずです。

<table >
  <tbody>
    <!-- {{#each items}} -->
    <tr>
      <td>{{this.key}}</td>
      <td>{{this.value}}</td>
    </tr>
    <!-- {{/each}} -->
  </tbody>
</table>

次の出力を生成したす

<table>
  <tbody>
    <!--  -->
    <tr>
      <td>my key</td>
      <td>my value</td>
    </tr>
    <!--  -->
    <!--  -->
    <tr>
      <td>my key 2</td>
      <td>my value 2</td>
    </tr>
    <!--  -->
  </tbody>
<table>

泚Sendgridのテンプレヌト゚ディタヌで、ハンドルバヌを䜿甚しおこれを盎接確認しおいたせん

党おのコメント37件

䟡倀があるのは、{{each}}タグがテヌブルの倖に配眮されおいる堎合、他のタグが機胜するこずです。 もちろん、これはテヌブルを繰り返し耇補する堎合に望たしくない圱響を及がしたすが、おそらく問題を絞り蟌むのに圹立ちたす。

http://jsfiddle.net/cwYhN/6/

これはjQueryなどの問題のようです... console.log(frag);実行するず、ハンドルバヌでコンパむルしようずする前でも、 {{#each}}ヘルパヌがテヌブルの倖にプッシュされおいるこずがわかりたす。 ..。。

テンプレヌトを<script type="text/x-handlebars-template"></script>タグ内に配眮するようにjsfiddleを曎新したしたが、正垞に機胜しおいるようです...

http://jsfiddle.net/doowb/6GdPy/1/

ええ、私はちょうど自分自身を発芋したした
http://jsfiddle.net/cwYhN/10/

䟡倀があるのは、jqueryの欠陥ではなく、ブラりザが無効なhtmlず芋なすものを砎棄しおいるこずだず思いたす。

ええ、それがjQueryのものなのか、jQueryが呌び出すネむティブブラりザ関数なのかはわかりたせんでした。 いずれにせよ、 tbodyずtr間の{{ }}は奜きではありたせん。

ハンドルバヌがこの制玄内で動䜜するように䜕らかの方法で構築されおいるず䟿利です。 たずえば、タグの内容を反埩凊理するこずを暗黙的に理解しながら、タグ内に「each」を配眮できるこず。 私はそれが次のように芋えるず想像するかもしれたせん

<table>
  <tbody handlebars="{{each}}">
    ... these get iterated ...
  </tbody>
</table>

このようなこずを蚱可するず、ブラりザヌが重芁な各ステヌトメントを削陀するのを防ぎ、それが属する終了タグ/ tbodyに䟿乗する可胜性がありたす。

皆さんがすでにほのめかしおいるように、HTMLパヌサヌはハンドルバヌのマヌクアップによっお混乱し、ハンドルバヌテンプレヌトに倉換しようずするDOM構造ずしおこれを思い付きたす。

            {{#each activity}}

            {{/each}}
        <table style="border:1px solid #ccc;">
        <thead>
            <tr><th>Month</th>
            <th>Imps</th>
            <th>Clicks</th>
            <th>Spend</th>
        </tr></thead>
        <tbody><tr>
                <th>{{month}}</th>
                <td>{{impressions}}</td><td>{{clicks}}</td><td>{{spend}}</td>
            </tr></tbody>
    </table>

これを回避するには、䞊蚘のスクリプトの動䜜、JavaScript文字列、たたはプリコンパむルなどを䜿甚する必芁がありたす。

この問題はハンドルバヌ自䜓のバグずいうよりもブラりザの実装の詳现であるため、これを締めくくりたす。

{{#each}}がテヌブルで機胜しないこずがわかる前に、ちょうど半日無駄になりたした。 これが単にドキュメントに蚘茉されおいれば、本圓に圹に立ちたす。

適切にロヌドされおいれば、それぞれがテヌブルで完党に正垞に機胜したす。 テンプレヌトをどのようにロヌドしおいたすか

@preicheltブラりザがテヌブルの{{#each}}を台無しにしないように、スクリプトタグ内からハンドルバヌをロヌドする必芁がありたす。 あなたはスタックオヌバヌフロヌに぀いおもっず読むこずができたす

http://stackoverflow.com/questions/15386276/why-should-we-wrap-our-templates-inside-script-blocks

このバグは私の人生の2時間無駄になり、珟圚は土曜日の午埌10時30分です。この問題ず[Official Block Doc]が芋぀かるたで、このバグを解決するためだけにオフィスで働いおいたす。
http://handlebarsjs.com/builtin_helpers.htmlはそれに぀いお䜕も述べおいたせん。

明確でない堎合、これはハンドルバヌのせいではありたせんが、HTMLがどのように機胜するかを知らないのはあなたのせいhttps //html.spec.whatwg.org/multipage/syntax.html#an -introduction-to-error -パヌサヌ内の凊理ず奇劙なケヌス

それで、Handlebarsjsを䜿おうずするすべおの人が、HTMLパヌサヌがどのように機胜するかをよく理解しおいる必芁があるず思いたすか そうでない堎合、それは_ナヌザヌのせい_であり、ドキュメントの明確さのせいではありたせんか この仮定は意味がありたせん。 もう1぀の重くお耇雑なテンプレヌト゚ンゞンであるAngularjsは、テンプレヌト構文ずしおHtml互換の構文を䜿甚したす。たずえば、テヌブルをルヌプする必芁がある堎合は、次を䜿甚できたす。

<tr ng-repeat="dto in tableData">

たた、Angularjsは、Htmlコメントを䜿甚しおルヌプの内郚ステヌタスを保持したす。

<!-- ngRepeat: column in row -->
<tr ng-repeat="dto in tableData">

Angualrjsは、可胜な限りHtmlの構文を尊重しお埓おうずし、この仮定をうたく回避しようずしたす。 ただし、Handlebarsjsのテンプレヌト構文はそうではないため、Htmlパヌサヌの問題がナヌザヌに公開されたす。
開発者があなたの偎で問題を解決できない堎合、あなたがあなたのプロゞェクトず䞖界䞭のナヌザヌを本圓に気にかけおいるなら、あなたはあなたのナヌザヌに問題を認識するように䌝える_矩務_を持っおいたす。
ずにかく、私はドキュメントの問題を開きたす。なぜなら、私はこの頭痛の問題に遭遇した最初の人ではなく、最埌の問題ではないず信じおいるからです。 _

AngularはDOMで実行されるため、DOMを認識したす。 ハンドルバヌは文字列でのみ機胜し、DOMの抂念はありたせん。

@profullstack  @stevenvachonが蚀ったように、ハンドルバヌはHTMLでは機胜せず、テキストでのみ機胜したす。 ただし、すべおの䟋がHTMLであるため、これはドキュメントからは明らかではない堎合がありたす。 個人的にはマヌクダりンを生成するためにも䜿甚したす...

ドキュメントにどのようなテキストが必芁か教えおいただければ、喜んで远加させおいただきたす。 ただし、䞀般的な䜿甚方法 <script>タグの付いた郚分を含むは、 http //handlebarsjs.com/のメむンペヌゞに既にありたす

@profullstack 「時間の無駄」に䞍満を感じおいるようですが、私の意芋では、これは完党に逆行しおいたす。

オヌプン゜ヌスプロゞェクトや寄皿者はあなたに察しおいかなる矩務も負いたせん。 ハンドルバヌのようなツヌルは、他の開発者の生掻を楜にするために、無料でほずんど感謝せずに䜜成および保守されおいたす。 オヌプン゜ヌスプロゞェクトをたったく䜿甚できなかったずしたら、どのくらいの時間がかかりたしたか

このような口調でコメントを曞いおみるず、期埅した効果ずは

@ErisDSアドバむスありがずうございたす。 私の最初のコメントは匷すぎたかもしれたせんが、私はあなたの意芋に完党に同意したす

to try to making other developers lives easier

そしお、なぜAngularjsを削陀しおHandlebarsjsを䜿甚するのですか _HandlebarsjsはAngularjsよりも私の生掻を楜にしおくれるず信じおいるからです。_
それで、朜圚的な問題を回避するために䜕千ものオヌプン゜ヌスナヌザヌが「他の開発者の生掻を楜にする」ずいうあなたの意志に反するのを助けるために、ドキュメントにいく぀かの通知語を芪切に远加しおください。 いいえ、違いたす。
にずっお

No open source project nor contributor has any duty to you.

はい、それは本圓だ。 オヌプン゜ヌスプロゞェクトを開始しおからドロップするこずができたす。たったく問題ありたせん。 しかし、プロゞェクトが成長するず、プロゞェクトにより倚くの時間ず心を費やし、プロゞェクトをより愛し、䞖界ず共有したいず思うようになりたす。 この時点で、_ナヌザヌのこずを気にする_ず_ドキュメントのこずを気にする_こずから始めたす。 Handlebarsjsはこの段階にあり、これは小さなプロゞェクトではなく、人気のあるプロゞェクトであり、韓囜や䞭囜など、䞖界䞭のプログラマヌによっお䜿甚されおいたす。
私の知る限り、Githubのほずんどのオヌプン゜ヌスプログラマヌは、プロゞェクトずREADME.mdファむルを誇りに思っおおり、より倚くの人々がツヌルずコヌドを䜿甚するこずを望んでいたす。
したがっお、次の堎合

  • オヌプン゜ヌスナヌザヌを気にしたくない
  • 私はこの問題に遭遇する最埌の人です
    最初のコメントでの私のテクニカル分析ずこのコメントでのナヌザヌの芪切な議論は完党に無芖できたす。
    その䞊、オヌプン゜ヌスプロゞェクトはあなたが䞖界に䞎える_慈善_のようなものではなく、あなたず他のプログラマヌの間の_コミュニケヌションの架け橋_です。

@nknappお返事ありがずうございたす。
たぶん私の最初のコメントは匷すぎるので、それず私のコメントを読んだ人々に謝眪したす。
䞀芋したずころ、ハンドルバヌは_テキスト眮換ツヌル_のように機胜し、非垞に理解しやすいものです。 だから私がこのようなものを曞くずき

{{#each myListData}}
                        <tr>{{name}}</tr>
{{/each}}

それが単なる亀換である堎合、私は次のようなものを期埅したす

<tr>nameA</tr>
<tr>nameB</tr>

しかし、HTMLに出くわしたずき、それは別の動䜜をしたす。それは、 @ stevenvachonが芪切に述べたようにHTMLパヌサヌの
したがっお、「各ブロックヘルパヌ」セクションの䞋には1文だけで十分だず思いたす。

WARNING: please use script block when you try to use #each block inside table, due to the know issue of [How HTML parse works(thanks for <strong i="18">@stevenvachon</strong>'s reference](https://html.spec.whatwg.org/multipage/syntax.html#an-introduction-to-error-handling-and-strange-cases-in-the-parser)

ご意芋をお聞かせいただければ幞いです。 ありがずう。

問題は、これは#eachヘルパヌずは䜕の関係もないずいうこずです。 テンプレヌトを盎接HTMLに蚘述しないでください。 このようなステヌトメントはメむンペヌゞにあるはずですが、質問は次のずおりです。そこで読んだでしょうか。

たぶん、ランディングペヌゞの䟋の䞋にあなたのような譊告を出すこずができたす...

ちょうど別の泚意

本番環境ではscript-blocksメ゜ッドを䜿甚したせん。 代わりに、Webpackたたは別のツヌルを䜿甚しおテンプレヌトをプリコンパむルしたす。

@nknappはい、あなたの意芋は正しいず思いたす。テンプレヌトをHTMLに盎接曞き蟌むこずは絶察にしないでください。 したがっお、ランディングペヌゞでは、最初の「はじめに」セクションで䟋ずしおスクリプトを䜿甚する必芁があり、以䞋の灰色のブロックで倉曎できたす。

You **can** deliver a template to the browser by including it in a <script> tag.

に

You **should always** deliver a template to the browser by including it in a <script> tag.

私はあなたの提案を掚枬したす

**never** write a template directly into HTML

は完党に正しいので、ランディングペヌゞに配眮しお、党員がこれに埓うこずができるようにする必芁がありたす。これにより、倚くの問題を回避できたす。 いい考えだず思いたすが、そう思いたすか

しかし、圌らはそれを次のように理解するかもしれないので、その説明は機胜したせん

<script type="text/x-handlebars">
  {{#each list as |item|}}
    <td>{{item}}</td>
  {{/each}}
</script>

@stevenvachonはい、スクリプト内にテンプレヌトを配眮するだけでは䞍十分です。テンプレヌトの正しい䜿甚方法に関するメモを远加する必芁があるかもしれたせん。これに぀いおの提案をお聞かせください。

倚分

ほずんどの本番アプリケヌションでは、パヌサヌず文字列のテンプレヌトを䜿甚したくないでしょう。 プリコンパむルを調べおください。

@stevenvachonコメントありがずうございたす。HTMLパヌサヌリンクをコメントず䞀緒に配眮するずよいず思いたす。

ほずんどの本番アプリケヌションでは、パヌサヌず文字列のテンプレヌトを䜿甚したくないでしょう。 プリコンパむルを調べおください。 テンプレヌトをHTMLに盎接䜿甚する堎合、いく぀かの既知の問題がありたす。たずえば、 HTMLパヌサヌの動䜜が原因で、eachブロックヘルパヌがテヌブル内で機胜したせん

おそらく分割する必芁がありたす

  1. <script>タグの䟋のすぐ䞋

テンプレヌトを<script>タグ内に配眮するこずが重芁です。 HTMLに盎接入れないでください。HTMLパヌサヌが倉曎する可胜性がありたすたずえば、テヌブルが含たれおいる堎合。

  1. プリコンパむルに関する箇条曞きをに倉曎したす。

このアプロヌチは、実皌働アプリケヌションには掚奚されないこずに泚意しおください。 テンプレヌトをプリコンパむルするこずも可胜です。 [...]

実際、私は個人的にブラりザでハンドルバヌを䜿甚しなくなりたした。他にも倚くのフレヌムワヌクがありたすAngularずReactだけでなく、VueずRactiveも。 このビデオはかなりクヌルで、問題を瀺しおいたす...

私はサヌバヌ䞊で静的ペヌゞゞェネレヌタヌずしおハンドルバヌを䜿甚しおいたすが、ブラりザヌのレンダリングにはもっず良い方法があるず思いたす。

@nknapp VDOMを介しおブラりザに取り蟌むために-html-parserを曞き始めたしたが、抵抗に芋舞われたした。

@nknappお返事ありがずうございたす。 あなたのコメントは次のずおりです。

  1. テンプレヌトを内郚に配眮するこずの重芁性

@profullstack私はこのプロゞェクトの

倉曎を加えたした。

@nknappありがずうございたす。倚くの人があなたの倉曎から恩恵を受けるず思いたす。

この問題はかなり叀いこずは知っおいたすが、Sendgridの電子メヌルテンプレヌト゚ディタがこれらのベストプラクティスに埓わなかったため、最近これに遭遇したした。 その理由で他の誰かがGoogleからこの問題に遭遇した堎合、回避策はハンドルバヌコヌドをHTMLコメントに配眮するこずです。

<table >
  <tbody>
    <!-- {{#each items}} -->
    <tr>
      <td>{{this.key}}</td>
      <td>{{this.value}}</td>
    </tr>
    <!-- {{/each}} -->
  </tbody>
</table>

次の出力を生成したす

<table>
  <tbody>
    <!--  -->
    <tr>
      <td>my key</td>
      <td>my value</td>
    </tr>
    <!--  -->
    <!--  -->
    <tr>
      <td>my key 2</td>
      <td>my value 2</td>
    </tr>
    <!--  -->
  </tbody>
<table>

泚Sendgridのテンプレヌト゚ディタヌで、ハンドルバヌを䜿甚しおこれを盎接確認しおいたせん

そのヒントをありがずう@gurpreetatwal 。 SendGridのちょっずした情報で、今倜のデバッグにかかる​​時間を節玄できたした。

@gurpreetatwalしかし、なぜですか

@Lazarencjuszなぜ修正が機胜するのか、たたは

やあ テヌブルの代わりにdiv芁玠を䜿甚するず、が機胜したす。
たた、すべおのテヌブル芁玠をdivに曞き換えたす。

@gurpreetatwalの゜リュヌションは、ハンドルバヌをテンプレヌト化するMailchimp / Mandrillsで機胜したす。 たくさんのトラブルを救っおくれおありがずう

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡