在 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}}
问题是,这不能生成我们用#each
.
- 将整个内容包装在一个
<ul>
标签中,无论列表是否为空,它都会被渲染 - 将标签粘贴
<ul>
在第一个块(正块?肯定?)并且每次都呈现
所以实现似乎依赖于标记。很公平。
这就是问题所在。
据说,#each
并#list
以不同的方式更新 DOM。从文档中#each
...
如果键的值是 can.List,则生成的 HTML 会在列表更改时更新。当列表发生变化时,只发生最少量的 DOM 元素变化。
因此,将一项添加到列表中,仅呈现该项,删除一项,仅删除该元素。的行为#list
没有记录,但我的印象是它可能会重新渲染整个块。
问题
哪个最好?除了更简洁之外,我不确定#list
它有什么优势,那么为什么作者建议它是首选呢?