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
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions