0

私は2分ごとに更新されるListViewに取り組んでいます。リストビューは複数のテンプレートを使用します(カスタムitemTemplate関数を使用して割り当てられます)

リストビューに複数のテンプレートがあるため、dataSource.change関数を使用してデータを単純に更新することはできません。最新のデータに基づいて正しいテンプレートを再度選択できるように、dataSourceをリセットする必要があります。

しかし、dataSourceを再割り当てすると、気が散るちらつきアニメーションが発生します。そのアニメーションを取り除きたいです。

var listView = element.querySelector('.my-list-view').winControl;
var list = new WinJS.Binding.List(data);
listView.itemTemplate = function (itemPromise) {
    return itemPromise.then(function (item) {
        var container = document.createElement("div");
        var itemTemplate;
        switch (item.data.status) {
            case "Final":
                itemTemplate = element.querySelector(".final-template");
                break;

            case "NotFinal":
                itemTemplate = element.querySelector(".not-final-template");
                break;
        }

        itemTemplate.winControl.render(item.data, container);
        container.style.height = '120px';
        container.style.width = '380px';
        return container;
    });
};
listView.itemDataSource = list.dataSource;
listView.addEventListener("contentanimating", function (e) { e.preventDefault() });
4

2 に答える 2

1

を使用していつでもアニメーションを無効WinJS.UI.disableAnimations();にし、リセットが完了したら再び有効にすることができますListView LoadingState

于 2013-05-04T22:52:46.783 に答える
1

なぜデータをリセットする必要があるのですか?複数のテンプレートを使用している場合、アイテムをレンダリングする必要があるときに itemTemplate レンダリング関数が呼び出されます。また、アイテムを変更して追加したり、基になるデータ セットに置き換えたりすると、リストビューはそれに反応できます。これにより、アイテム テンプレートを呼び出すことができます。これは、特に ARM などのローエンド デバイスでは、リスト ビューにすべてのデータを再度レンダリングするように要求するよりもはるかに効率的です。

itemTemplate レンダリング関数の詳細については、こちらのセクション「テンプレートまたはレンダリング関数を使用してアイテムを表示する」を参照してください

ただし、これでもうまくいかない場合は、「contentanimating」イベントを処理し、preventDefault()発生したときにイベント オブジェクトを呼び出すことで、リスト ビューでアニメーションを無効にすることができます。例えば

var myListview = /* get listview control some how */
myListView.addEventListener("contentanimating", function(e) { e.preventDefault() });

コードがリストビュー インスタンスよりも長く存続している場合は、リスナーをデタッチすることを忘れないでください。

于 2012-09-11T15:53:38.963 に答える