渲染异步化
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会相互关联,以及对一个普通容器类的继承和重写
从当前的环境来看,我推荐方案四, @Justineo @errorrik 和 @Exodia 等各位有没有什么想法
渲染异步化
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会相互关联,以及对一个普通容器类的继承和重写从当前的环境来看,我推荐方案四, @Justineo @errorrik 和 @Exodia 等各位有没有什么想法