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

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

_.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 回答