Skip to end of metadata
Go to start of metadata

重新定义了所有辅助性的标记

原实现中,Dorado7提供了Import、ImportStart、ImportEnd、ExportStart、ExportEnd这5种辅助性的标记。主要存在下面两方面的问题:

  • Import、ImportStart、ImportEnd可用于引入外部配置信息和作为模板中的占位符。当Import标记用于模板占位符时,该命名容易引入混淆。且我认为引入外部配置和占位符应该是两个完全不同的概念,不应公用一套标记。
  • 另外,Vangie提出Export标记的语义太过强烈,容易导致开发者忽略直接使用控件ID作为配置导出源的特性。

现对这些标记进行了重新定义,目前提供Import、GroupStart、GroupEnd、PlaceHolder、PlaceHolderStart、PlaceHolderEnd共6种辅助性的标记。

  • Import专用于引入外部配置信息,只有src一个属性。
  • GroupStart、GroupEnd替代原ExportStart、ExportEnd。
  • PlaceHolder、PlaceHolderStart、PlaceHolderEnd用于模板中的占位符。

对所有可在Spring中的配置的Loader、Register类Bean进行了整理优化

Dorado7中使用了很多实现Spring的PostBeanFactory接口的Bean用于定义配置文件的装载方式、注册控件、拦截器等。这次对所有这些Bean的API做了统一的调整优化。

默认不再使用集合的方式定义要装载或注册的内容

以dorado.packagesConfigLoader为例,原定义方法如下:

新的定义方法将调整为:

几乎所有的原来支持以集合的方式定义被注册内容的Bean都改为了非集合方式。做此调整的原因是未来大部分场景中每次只需要向系统中注册一个信息,没必要引入集合。如果确实需要一次性的注册多项信息,只要定义多个注册Bean即可。

统一命名起见,修改了dorado.dataConfigLoaderTemplate的名称。

原先在home:context.xml中的定义方法一般是:

今后应该为:

实现了ViewConfig对象

在目前的.view.xml中可以看到文件的根节点是一个ViewConfig节点,Model、View是其中的子节点。但是在实际的运行状态中,Dorado中并没有一个真正的ViewConfig对象,而是只会创建一个View对象,同时定义在Model中的私有的DataType、DataProvider等都是由View负责管理。这种设计不但容易引入误解同时也带来了很多其他问题。

例如原先我们为View提供了onCreateListener、onInitListener、onReadyListener三种监听器,其中onReadyListener只会为View需要渲染时才会被触发(通常是页面打开的过程中),而在Ajax视图访问View中的私有DataType、DataProvider时,View对象同样会被创建,但是不会触发onReadyListener。也就是说View是有rendering、service两种状态。这种设计方式同Dorado5非常相似,十分难以让人理解。

因此,在新的实现方式中。我实现了ViewConfig这样一个对象。View是ViewConfig中的一个子对象,而私有DataType、DataProvider等都将交由ViewConfig来管理。该结构与开发者在IDE中的看到的.view.xml的文件结构一致。ViewConfig在rendering、service两种状态下都可能会被创建,而ViewConfig中的View作为ViewConfig的可视部分则只会在rendering状态下会被创建。

基于上述调整,产生了如下一些不能向上兼容的改进:

  • 原有的onCreateListener、onInitListener、onReadyListener三种监听器被一个叫listener的监听器取代,当你的逻辑需要在rendering、service两种状态下都被触发时可以把逻辑定义在ViewConfig的listener中;当你的逻辑只需要在rendering状态下都被触发时可以把逻辑定义在View的listener中。例如动态为视图创建一些控件的逻辑就应该放在View的listener中。
  • 原View节点下的template属性被移到了ViewConfig节点中。
  • 原Dorado7内部的ViewManager对象已被移除,取而代之的是ViewConfigManager,其返回的对象也是ViewConfig的实例。

注意:在新的View的listener触发机制中,Dorado7已不会自动寻找名为onReady的方法,因此在指定listener时必须明确在服务定位表达式中声明方法名。
如果需要为某对象定义多个Listener,只需用","将多个服务定位表达式隔开即可。

Labels
  • No labels