Can.js で同じことを行うには、いくつかの異なる方法があるようです。これは素晴らしいことです。ただし、一部の方法は他の方法とは少し異なり、DOM のレンダリングおよび更新方法に影響を与える可能性があります。誰かがニュアンスを明確にしてくれれば幸いです。
この選択が興味深いシナリオは、デフォルトのテキストまたは空のリストのプレースホルダーが必要な場合だと思います。
{{#if list}} および {{#if list.length}}
これらは同じではありません。空の配列と can.List の両方が に対してレンダリングされ{{#if list}}
ます。
{{#各リスト}}
だから私たちが学んだことを使って#if
...
{{#if list.length}}
<ul>
{{#each list}}
<li>...<li>
{{/each}}
</ul>
{{else}}
<i>The list is empty.</i>
{{/if}}
{{#リスト}}
これは、両方の世界で最高のものになることを意図していると思います。これはブロック ヘルパーであるため、{{else}}
.
{{#list}}
rendered for each item in list
{{else}}
rendered once if list is empty
{{/list}}
問題は、これは で行った html を生成できないということです#each
。
- すべてをタグでラップする
<ul>
と、リストが空であるかどうかに関係なくレンダリングされます - タグ
<ul>
を最初のブロック (肯定的なブロック?肯定的なブロック?) に貼り付けると、毎回レンダリングされます。
したがって、実装はマークアップに依存しているようです。けっこうだ。
これがこすりです。
おそらく、 DOMを別の方法#each
で#list
更新します。ドキュメントから#each
...
キーの値が can.List の場合、結果の HTML はリストが変更されると更新されます。リストの変更が発生すると、最小限の DOM 要素の変更のみが発生します。
したがって、リストに 1 つの項目を追加すると、その項目のみがレンダリングされ、項目を削除すると、その要素のみが削除されます。の動作#list
は文書化されていませんが、ブロック全体を再レンダリングする可能性があるという印象を受けています。
質問
どれが最高ですか?より簡潔であることに加え#list
て、利点があるかどうかはわかりませんが、なぜ著者はそれが好ましいと示唆しているのですか?