您需要确保 Meteor 的反应式渲染不会破坏 iScroll 创建的 DOM 节点,并在 iScroll 确实被破坏和重新创建时重新实例化它们。每次更改滚动器内的 DOM 时,您还需要调用 iScroll.refresh() 以便它知道更新其尺寸。
让我们看一个例子 - 假设您有一个模板,其中包含要滚动的集合:
<template name="myCollectionView">
<div class="my_collection">
<div class="scroller">
{{#isolate}}
{{#each items}}
{{> item}}
{{/each}}
{{/isolate}}
</div>
</div>
</template>
请注意,您需要使用 div 双重包装您的收藏。用于传递给 iScroll的外部 div ,以及实际上将被 iScroll 的 JS 移动my_collection
的单个内部 div 。scroller
还要注意#isolate
周围的块items
- 这告诉 Meteor 不要在该块之外传播重新渲染,这样当集合更改时,外部 DOM(包装器和滚动节点)不会被替换。
现在让我们初始化 iScroll 并添加适当的簿记以在 DOM 因 Meteor 的反应性而发生变化时保持运行:
var scroller; // file-scope instance of iScroll that we will update appropriately
...
Template.myCollectionView.rendered = function () {
var scrollNode = this.find('.scroller');
// let's figure out if iScroll is already running by checking whether
// it's DOM nodes are still intact.
if (scrollNode.style.webkitTransform == "") {
// either first time rendering, or someone replaced our DOM nodes.
// Re-instantiate iScroll.
scroller = new iScroll(this.find('.my_collection'));
} else {
// DOM is still intact, just tell iScroll to update its size
// You need to do this in a setTimeout to make sure DOM changes
// have already been rendered (this affects size computations)
Meteor.setTimeout(function () { scroller.refresh(); }, 0);
}
}
确保您已overflow: hidden;
在 CSS 中为您的包装器 div 设置(即.my_collection
),并且一切顺利。