EmberJS View - 检测是不是所有子视图都已呈现

Posted

技术标签:

【中文标题】EmberJS View - 检测是不是所有子视图都已呈现【英文标题】:EmberJS View - detect if all children views have been renderedEmberJS View - 检测是否所有子视图都已呈现 【发布时间】:2013-04-19 19:19:51 【问题描述】:

场景:

笔记集合(异步加载)被渲染 两个视图:表示笔记列表的 NoteView 和表示单个笔记的 NoteOnListView 我必须运行一些代码 (masonry.js) 来放置它们,但它需要首先呈现所有音符,它需要知道这些孩子的计数和属性

我有一个模板,notes.hjs

#each note in controller
    view App.NoteOnListView
/each

和观点:

App.NotesView = Ember.View.extend(
    didInsertElement: function() 
        console.log('the list has been rendered');
    
);

App.NoteOnListView = Ember.View.extend(
    didInsertElement: function() 
        console.log('a note has been inserted');
    ,
    afterRender: function() 
        console.log('a note has been rendered');
    
);

控制台输出:

the list has been rendered 
XHR finished loading: "http://localhost:3000/notes"
a note has been rendered
a note has been inserted
a note has been rendered
a note has been inserted
// ... 
a note has been rendered
a note has been inserted
// This is where I need to run code!

我有一些可能的解决方案来解决这个问题,但它们看起来都很老套。有没有一种好方法可以告诉 NotesView 等到它的所有子元素都被渲染?

【问题讨论】:

【参考方案1】:

如果您将策略更改为子类化 Ember.CollectionView,您可以使用以下方法接收您的子视图已完成渲染的通知。

App.CV = Ember.CollectionView.extend( 
    itemViewClass : Ember.View.extend( 
        templateName : 'item'
     ),

    onChildViewsChanged : function( obj, key )
        var length = this.get( 'childViews.length' );
        if( length > 0 )
            Ember.run.scheduleOnce( 'afterRender', this, 'childViewsDidRender' );
        
    .observes( 'childViews' ),

    childViewsDidRender : function()
        //child views have finished rendering!     
    
 );

这是一个 example,它在 Ember 1.0 RC2 中演示了这种技术。

有关 Ember.run.scheduleOnce 的更多信息,请参阅docs。

【讨论】:

很好的答案。使用 scheduleOnce 而不是 schedule 可能会很有用,以避免在同一个运行循环中多次意外调用 childViewsDidRender。 感谢您的回答。我尝试了使用集合视图的方法。问题是,当我将类类型更改为 CollectionView 时,视图未绑定到路由并且未呈现。我希望它被用作默认视图,但我没有在网上找到任何资源如何做到这一点。 CollectionView 文档建议该类用于静态项目,这不是我的用例。顺便说一句,目前,我每次渲染项目时都会调用 Masonry,它工作正常。 哇,太棒了!我将不得不查看Ember.run"afterRender" 部分是如何工作的? @Knownasilya 请参阅source 了解更多信息。

以上是关于EmberJS View - 检测是不是所有子视图都已呈现的主要内容,如果未能解决你的问题,请参考以下文章

在 emberjs 中重新渲染视图

iOS:如何检测视图周围的子视图位置

EmberJS 从控制器加载视图而不是路由

循环遍历Android视图的所有子视图?

Emberjs:从子视图中解析表单数据

是否可以通过拖动将一个视图的子视图移动到另一个视图?