3

私は現在、Backboneを使用したメッセージングシステムに取り組んでいます。レンダリング時にCollectionViewの最後の要素までスクロールしたい。

ページ上のリンクをクリックするとこれを機能させることができますが、ビューのレンダリングで機能させたいと思います。

リンクで使用しているものは次のとおりです。

document.getElementById('message-new-conversation-dialog').scrollIntoView();

ビューの定義は次のとおりです。

var ConversationView = LSmixBB.CollectionView.extend({

        itemView: MessageView,
        template: "#message-conversation-template",
        onRender: function(){
            document.getElementById('message-new-conversation-dialog').scrollIntoView();
            document.getElementById('global-column-middle-footer1').scrollIntoView();
        }

    });

onRender内のページに何もないので、機能しないと思いますか?

私はウェブ開発にとても慣れていないので、優しくしてください!

とにかく、私は本当に助けていただければ幸いです!

4

2 に答える 2

5

Backbone を使用している場合は、Underscore の _defer 関数にアクセスできます: http://underscorejs.org/#defer

thisこれは、すべての DOM 操作が完了するまで待機し、関数が実行されます。呼び出し元への内部参照が必要な場合は、渡すことができます

_.defer(function(caller){
      //caller is now a reference to the scope where you declared this
}, this);

子ビューを非同期で作成する必要があるビューがある場合にこれを使用しますが、それらの子ビューでは親ビューをレンダリングして DOM にする必要があります。子ビューを完全に制御できる場合は、何らかのタイプのコールバックを使用する方がよい場合があります。

注: 要素に対して jQuery の .ready 関数を使用することもできますが、まだ試していませんが、_defer は基本的にコール スタックの実行が完了するまで待機するため、場合によってはより良い解決策になる可能性があります。

于 2012-05-31T00:45:05.793 に答える
3

誰かがこれを便利だと思った場合に備えて、タイムアウトを使用してしまいましたが、うまくいきました。したがって、scrollIntoView を使用する関数を作成できますが、ページをレンダリングできるように実行するのに 200 ミリ秒の遅延があります。

このビュー内でコレクションをレンダリングしていたため、アイテムは onRender でレンダリングされませんでした。

おそらくこれを行うためのより良い方法がありますが、これまでのところまだ見つけていません!

于 2012-05-29T16:34:18.360 に答える