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 で二重にラップする必要があることに注意してください。my_collection
iScroll に渡すための外側の divと、 scroller
iScroll の JS によって実際に移動される単一の内部 div。
#isolate
の周りのブロックにも注意してください。items
これは、コレクションが変更されたときに、外部 DOM (ラッパー ノードとスクローラー ノード) が置き換えられないように、そのブロックの外側に再レンダリングを伝播しないように Meteor に指示します。
次に、iScroll を初期化し、適切な簿記を追加して、Meteor の反応性によって DOM が変更されたときに実行し続けるようにしましょう。
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;
ラッパー div (つまり ) の CSSが設定されていることを確認してください.my_collection
。