我目前正致力于使用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里面的页面上什么都没有?
我对网络开发很陌生,所以要温柔!
无论如何,我真的很感激任何帮助!
答案 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中呈现。
可能有更好的方法可以做到这一点,但到目前为止我还没有找到一个!