-
Notifications
You must be signed in to change notification settings - Fork 15
Open
Description
渲染异步化
ER的View#render方法是同步的,但在现实中往往有一些异步的情况存在:
ActionPanel、ViewPanel等涉及到加载某些AMD模块- 在渲染过程中需要通过
Action和Model获取一些数据
由于render方法同步的特性,导致在enterDocument中处理逻辑需要对异步进行等待的操作,进一步让代码复杂度提高
我们希望render可以是一个异步的过程,这一修改大致如下:
对er.View进行修改,增加一个wait({Promise} promise)方法,渲染过程只有在所有promise均完成后,才会进入enterDocument
自动异步等待
我们希望ActionPanel和ViewPanel之类的一定会有异步行为的控件可以自动被wait,因此我们需要一些进一步的修改,以下是几种方案:
方案一
- 修改
esui.main.init方法,在每个控件render()时提供一个controlrender事件,通过这一事件可以获取控件实例,供ef.UIView来判断 - 修改
ef.UIView,注册controlrender事件,将所有有异步的控件添加到wait中
这个方案的缺点是esui.main是单例的,注册和注销事件如果有所遗漏会造成不可预期的全局影响。
方案二
基于方案一,将esui.main做成class的形式,每一个UIView会单独有一个实例,以解决单例对象上事件管理的问题
这个方案的缺点是修改代价很高
方案三
在esui.ViewContext上实现getAllControls或者queryByType方法,能够获取到需要的控件
这个方案的缺点是可能会破坏一些ViewContext希望提供的封装性
方案四
由ef实现一个ViewContext子类,重写add方法,当需要的控件被添加时会自动wait
这个方案的缺点是看上去很别扭,包括ViewContext和UIView会相互关联,以及对一个普通容器类的继承和重写
Metadata
Metadata
Assignees
Labels
No labels