0

項目を observableArray に追加するときにかなりの slideDown 効果が得られるように、 afterAdd バインディングを指定しました。うまく機能し、かっこよく見えます。

問題は初期ロードにあります。データ ソースから読み込み、observableArray を返された json データに設定しています。画面上の 20 個のアイテムがすべて同時に滑り落ちると想像してください。かっこよくない。どうすればそれを防ぐことができますか?

スライド機能:

vm.addItem = function (elem) {
    if (elem.nodeType === 1) { $(elem).hide().slideDown(); }
};

単一のアイテムを追加すると素敵に見えます:

vm.postComment = function () {
    $.post('Place/PostComment', { placeId: vm.placeId(), comment: vm.comment() }, function (comment) {
        vm.comments.push(comment);
        vm.comment('');
    });
};

初期値を設定するときはあまり良くありません。追加するたびに下にスライド:

vm.loadPlace = function () {
    $.getJSON('Place/GetComments', { placeId: vm.placeId() }, function (data) {
        vm.comments(data.Comments);
    });
};

2012/11/16 朝更新

Vyacheslav Voronchuk の提案から、私の HTML は次のようになります。

<ul id="placeComments" data-bind="foreach: { data: comments, afterAdd: addItem, afterRender: renderedComments, beforeRemove: removeItem }">

Javascript は次のようになります。

vm.renderedComments = function () {
    loading = false;
};

vm.addItem = function (elem) {
    if (!loading) {
        if (elem.nodeType === 1) {
            $(elem).hide().slideDown();
        }
    }
};

vm.loadPlace = function () {
    $.getJSON('Place/GetPlace', { placeId: vm.placeId() }, function (data) {
        loading = true;
        vm.comments(data.Comments);
    });
};

アニメはまだ見てます。デバッガーを使用すると、addItem 関数に 2 回入ることがわかります。

余談ですが、これがドキュメントがslideDownの代わりにfadeInを使用している理由だと思います。乗り換えた方がいいのかな…

4

1 に答える 1