Skip to content

异步的View#render #39

@otakustay

Description

@otakustay

渲染异步化

ER的View#render方法是同步的,但在现实中往往有一些异步的情况存在:

  1. ActionPanelViewPanel等涉及到加载某些AMD模块
  2. 在渲染过程中需要通过ActionModel获取一些数据

由于render方法同步的特性,导致在enterDocument中处理逻辑需要对异步进行等待的操作,进一步让代码复杂度提高

我们希望render可以是一个异步的过程,这一修改大致如下:

er.View进行修改,增加一个wait({Promise} promise)方法,渲染过程只有在所有promise均完成后,才会进入enterDocument

自动异步等待

我们希望ActionPanelViewPanel之类的一定会有异步行为的控件可以自动被wait,因此我们需要一些进一步的修改,以下是几种方案:

方案一

  1. 修改esui.main.init方法,在每个控件render()时提供一个controlrender事件,通过这一事件可以获取控件实例,供ef.UIView来判断
  2. 修改ef.UIView,注册controlrender事件,将所有有异步的控件添加到wait

这个方案的缺点是esui.main是单例的,注册和注销事件如果有所遗漏会造成不可预期的全局影响。

方案二

基于方案一,将esui.main做成class的形式,每一个UIView会单独有一个实例,以解决单例对象上事件管理的问题

这个方案的缺点是修改代价很高

方案三

esui.ViewContext上实现getAllControls或者queryByType方法,能够获取到需要的控件

这个方案的缺点是可能会破坏一些ViewContext希望提供的封装性

方案四

ef实现一个ViewContext子类,重写add方法,当需要的控件被添加时会自动wait

这个方案的缺点是看上去很别扭,包括ViewContextUIView会相互关联,以及对一个普通容器类的继承和重写


从当前的环境来看,我推荐方案四@Justineo @errorrik@Exodia 等各位有没有什么想法

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions