和《Flex3权威指南》一样,全书又是贯穿着FlexGrocer这个项目,但是书上的版本是以Flex4.0为SDK的,现在已经出到了Flex4.5.1。所以照着书上的写完了之后又照着Flex4.5.1的文档改成了新的版本。

最终版本是http://gerhut.net/flexgrocer/

《Flex4权威指南》与《Flex3权威指南》相比,着重讲解了Spark组件的前后台分离功能,这也是Flex4的主要亮点。删除了许多与服务器通信的内容。同时也删除了有关动画的内容,这一块还没有看文档,估计Flex4相对Flex3没有更新动画相关内容。

Flex4是一个过渡性的版本,整个版本的目标就是将Flex的旧的古老的Halo组件逐渐的升级为Spark组件。Halo组件虽然发展很成熟,但是它没有完全做到显示与实现相分离。而Spark组件就完全的做到了显示与实现的相分离。具体的来说,在后台的ActionScript端,只需要声明该组件需要几个子组件以及几个状态;前台MXML端根据后台需求将它们安放在合理的位置并指定样式,即完成一个组件的设计工作。而且,对其内部控件的样式设计可以直接建立在其原有样式代码的基础上。换句话说,可以名正言顺的修改系统自带的组件的任何部分使其符合整体的设计要求。

Halo与Spark组件在MXML中的另一个显著区别是对State的描述更加人性化。Halo的State记录的是变更。Spark的State直接限制组件的存在和属性。

鉴于Spark组件在皮肤设计能力的较大提升,使得Flex3中许多与皮肤设计有关的内容独立出来,典型的例子就是layout属性变成了像Java swing一样的ILayout接口,而非几个字符串简单形容。同时,一些组件也从运行视角改成了设计视角,典型的例子是Repeater组件更名成了DataGroup组件,Repeater是站在运行程序时的实现原理取的名字,而DataGroup显然就是一个设计概念了。

最后,简要总结一下Flex4.5.1相对书上的Flex4.0在FlexGrocer上的更新:

  1. Image控件在Spark组件包中得到了实现,可以从Halo包迁移到Spark包,需要更正的地方就是scaleContent属性在Spark包中变成了scaleMode属性。可以直接指定使用等比缩放或失真缩放。
  2. CurrencyFormatter在Spark组件包中得到了实现,可以迁移,小数位数的属性更名为fractionalDigits,同时,默认的parse方法下是用货币名作为格式套用的。置useCurrencySymbol为真可以维持货币符号的套用。
  3. DateFormatter在Spark中变成了DateTimeFormatter,迁移有两种途径:指定DateStyleTimeStyle或者直接自定义DateTimePattern属性。
  4. FormFormItem可以直接迁移到Spark,只不过horizonalLayout需要提出来单写。
  5. 还有一个最重要的更新就是DataGridDataGrid终于在Spark中得到了初步实现,不过在使用其默认皮肤的情况下还没有Halo的好看。具体迁移要注意以下罗马数字的几点:
  6. columns是列表,必须用ArrayListGridColumn(Halo的DataGridColumn)括起来。
  7. MXItemRenderer改成GridItemRenderer
  8. itemEditor问题最大,不能随便指定控件了,必须是GridItemEditor的子类才可以被用作itemEditor属性。同时GridItemEditor还没有接口可以用,只能继承,所以如果使用NumericStepper的话必须当成一个GridItemEditor的child,Adobe的官方博客上有解决方案,重载了GridItemEditorvalue属性的getter和setter,我认为将valueNumericSteppervalue属性作了双向绑定就可以了。有时间可以仔细分析一下运行效率有没有区别。

在Flex4.5.1上,仍然使用的Halo组件有以下三类:

  1. DataChooserDateFieldColorPicker:一些漏网之鱼,预计在下一个版本中会有相对应的Spark组件。
  2. ViewStack:实现导航的重要组件,Spark有NavigatorContent组件可以作为其child。但是ViewStack还没有在Spark中实现。由ViewStack衍生的TabNavigatorAccordion也没有在Spark中得以实现,期待在下一个版本中有所突破。
  3. 除了Currency之外的其他Validator,除CurrencyDateTime之外的Formatter。这个东西比较混乱,估计是跟ArrayCollection什么的似的,按FlexSDK开发小组目前的情况是在Spark中再次实现了部分类。而没有重写的类没有迁移入Spark包,估计将来会重新组织这些ValidatorFormatter