带有“afterAdd”的 Foreach 绑定会导致整个模板在插入时再次绘制
Foreach binding with 'afterAdd' causes the whole template to draw again on insertions
每当将新项目添加到列表中时,我都会尝试自动滚动页面的内容。
起初,我尝试在foreach
绑定中使用afterAdd
,因为它似乎是我想要的。所以我做了这样的事情:
<ul data-bind="foreach: { data: contents,
afterAdd: function(e) { e.scrollIntoView(false); } }">
<li data-bind="text: field"></li>
</ul>
这是对代码的摆弄
如果你尝试这样做,你会发现对我来说是一些非常奇怪的行为。对于每次调用,Knockout 似乎都在从头开始重新创建整个模板。因此,在第一个"添加"中,添加一个元素。在第二个添加时,再次添加第一个和第二个,依此类推。
无论我尝试什么,我都无法使它工作,但是这个使用afterRender
的版本有效:
<ul data-bind="foreach: { data: contents,
afterRender: function(e) { e[1].scrollIntoView(false); } }">
<li data-bind="text: field"></li>
</ul>
不同之处在于,我不是直接获取元素,而是获取所有 DOM 元素的数组。
您也可以在小提琴中测试行为。如果您继续添加项目,当屏幕到达底部时,它将开始滚动到新添加的元素。
为什么我不能为此使用afterAdd
?疯狂的行为到底发生了什么?
似乎afterAdd
对于实际呈现的每个元素都调用一次。 在您的示例中,每次添加项目时都会调用 3 次。 第一次(对我来说,至少在 Chrome 中(是使用文本节点,它没有scrollIntoView
方法。 最简单的解决方案是在调用该方法之前进行检查,尽管这对我来说仍然是一种捏造:
<ul data-bind="foreach: { data: contents, afterAdd: function(e) { if (e.scrollIntoView) e.scrollIntoView(false); } }">
<!-- ... --->
</ul>
这样,它只会尝试滚动具有可用方法的元素。
更新的小提琴
相关文章:
- 将样式表插入iframe
- D3在一个调用中绘制不同的SVG形状,没有可见性
- Ckeditor-plugin:插入虚假元素add不情愿<p>标签前后
- 如何动态插入jquery代码
- 有没有一个javascript图形绘制库可以进行气球树布局
- 动态插入的表:JQuery未检测到最后一行
- 使用JavaScript动态插入DIV的成本有多高
- 使用相同的数据集绘制各种符号
- 带有填充属性的SVG矩形显示在包含元素的上方插入框阴影
- 使用onclick绘制SVG路径
- 在谷歌地图上绘制位置数据库
- 用chart.js绘制条形图
- 在画布背景图像上插入绘制的形状
- 将位置插入集合后,重新绘制标记和簇
- 如何确定浏览器何时完成绘制插入的元素
- 带有“afterAdd”的 Foreach 绑定会导致整个模板在插入时再次绘制
- 画布绘制图像函数在画布后插入 img
- 创建图像,大小相对于窗口宽度.插入DOM时没有绘制图像
- 为什么要以编程方式插入SVG <元素不绘制,除了d3.js
- 我可以将数组值插入到画布的图像绘制函数中吗?