大多数开发者(尤其是Web应用开发者)已经非常熟悉人机交互系统开发中关于MVC(模型/视图/控制器)的概念,那么用Flex开发企业应用时,MVC模型是否依然适用呢?在Flex中该如何实现MVC呢?接下来我们就一起探讨一下这些问题。
很显然,在Flex开发中,MXML文件天生就是视图,客户端所保持的状态是模型。然而,什么是控制器呢?
在回答这个问题之前,我们首先回顾一下MVC中控制器的作用:“在MVC模型中,
控制器控制模型状态变化的传播,确保用户界面与模型之间的对应联系,保证界面能够反映正确的模型状态,控制器接受用户的输入,将输入反馈给模型,进而实现对模型的计算控制,是使模型和视图协调工作的部件。将模型、视图、控制器进行分离,使设计和使用都具有很大灵活性。但是,在现实中,视图和控制器的功能通常是紧密地联系在一起的。控制视图工作的输入事件通常都是与视图的构成相关的。在现实界面设计环境中,界面操作事件及其处理都是与界面形式设计紧密关联的。在这种情况下,把视图和控制器分离开,就给分析和设计带来了不便,而且运行的效率低。”
根据上面对“控制器”职责的论述,我们认为,Flex中的控制器应该与视图结合在一起,也就是说属于控制器的代码应当写在MXML文件中。为此,我们形成了比较朴素的客户端MVC开发思路:
开发人机界面时,写一个MXML文件和一个AS类文件,二者名称相同但是扩展名不同。MXML文件作为视图和视图控制器(视图跳转和弹出子视图的代码放在MXML文件中),AS类文件作为模型。模型上定义视图所需要的数据,以及数据的处理逻辑(比如获取远程数据,对数据进行排序和过滤等)。在MXML视图上建立对模型的单向引用,然后视图上的控件通过绑定模型上的数据来实现展示模型数据的目的。而模型无需知道视图,于是当“视图”界面上的数据展示和操作控件发生变化时,不会影响到模型部分。当用户操作界面发生请求需要处理数据时,MXML上的响应控件事件的处理函数(属于控制器的代码)调用模型上的方法来改变数据,改变后的数据通过绑定机制(属于控制器的功能,由Flex框架提供)自动地刷新MXML视图。
这样做的最大好处就是简单易行,易于培训。除此之外,将视图和模型分离,当视图上的控件发生变化时不会影响模型上的数据处理。这种思路已经在我们的项目中多次实践,取得了很好的效果,下面就举一个项目中的实际例子来帮助读者更好地理解这种开发思路。