【发布时间】:2018-01-17 14:52:03
【问题描述】:
我启用了deferred updates。
我有两个组件。
第一个是列表,简单实现为带有foreach数据绑定的div:
<div class="list-people" data-bind="foreach: { data: people, afterRender: afterRenderPeople }">
<!-- ko component: { name: "listitem-person", params: { person: $data } } --><!-- /ko -->
</div>
第二个是列表项:
<div class="listitem-person">
<span data-bind="text: Name"></span>
</div>
为foreach 中的每个项目调用afterRender。
我的afterRenderPerson 函数很简单:
public afterRenderPerson = (elements: any[], data: Person) => {
let top = $(element[0]).offset().top;
scrollTo(top);
};
问题是当afterRenderPerson被调用时,子组件listitem-person还没有被渲染出来。
也就是说传递给afterRenderPerson的元素数组有4个节点:
- 包含
\n的文本节点,即新行。 - 包含
<!-- ko component: { name: "listitem-person", params: { person: $data } } -->的评论节点。 - 包含
<!-- /ko -->的评论节点。 - 包含
\n的文本节点,即一个新行。
这些都不适合获取top 像素,即使它们适合,正在渲染的子组件也可能会影响该位置的布局,从而改变我试图获取的像素的值。
【问题讨论】:
-
我能想到的唯一解决方法是定义一个自定义的
scrollTo绑定并将其包含在组件模板中... 很容易实现,但仍然感觉很hacky并且使您的内部组件更难重用.您可能还想跟踪这个feature request -
我一直在寻找的解决方法是使用 setInterval 来检测元素何时可通过 ID 获得。但是不得不诉诸这种方式让我觉得很肮脏。
标签: javascript typescript knockout.js