渲染Backbone视图后滚动到底部

时间:2012-05-24 10:51:02

标签: scroll backbone-views

我目前正致力于使用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里面的页面上什么都没有?

我对网络开发很陌生,所以要温柔!

无论如何,我真的很感激任何帮助!

2 个答案:

答案 0 :(得分:5)

如果您使用的是Backbone,您可以访问Underscore的_defer函数:http://underscorejs.org/#defer

这将等到所有DOM操作完成然后函数将执行,如果你需要对调用者的内部引用,你可以传递this

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

当我有需要异步创建子视图的视图时,我会使用它,但这些子视图需要在DOM中呈现父视图。如果您可以完全控制子视图,那么最好有一些类型的回调。

  

注意:你也可以在元素上使用jQuery的.ready函数,但是我   虽然它可能是一个更好的解决方案,但还没有玩过   在某些情况下,因为_defer基本上等到调用堆栈完成   执行

答案 1 :(得分:3)

如果有人发现这个有用,我最终会使用超时功能。因此,您可以编写一个使用scrollIntoView的函数,但运行时间为200毫秒,以允许页面呈现。

因为我在此视图中渲染了一个集合,所以这些项目没有在onRender中呈现。

可能有更好的方法可以做到这一点,但到目前为止我还没有找到一个!