Flex框架选择的一点个人之见( 转)

2023-12-05 04:32

本文主要是介绍Flex框架选择的一点个人之见( 转),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Flex框架时下,国人都热衷于开源框架,其实很多开源框架并不实用,开源框架成千上万,好用的还是少数,有时候,真得还要靠自己去造一些轮子。在Flex开发领域,较有名气的框架有两个,Cairongorm和pureMvc,在2007年的时候我曾在博客上分享了这两个框架的一些资料。

但经过一段时间的实践,我认为这些框架均不实用。

cairongorm过于死板,完成一个工作需要N多类,做很多事情都是在舍近求远。

pureMvc虽然比较灵活,考虑了视图的复用。但是工程大而视图复用很少的时候,使用这个框架非常不合适。当实在需要视图复用时,可以考虑使用pureMvc框架。另外,使用pureMvc要注意在你的窗口关闭时要及时清除已经注册的资源,否则会导致内存泄露。

以上还都是小问题,大问题在于,不论cairongorm和pureMvc,都是基于事件(消息),一个事件(消息)发出后,就很难知道那些组件对这些事件和消息感兴趣,也很难知道那个组件对这个消息或者事件进行了监听和处理。造成程序的调试和维护相当困难。很多隐藏的BUg都是因此而产生的。

所以建议不要使用这两个框架。我们在项目中因使用pureMvc吃了很多苦头,希望后来者重视。

我建议开发者按照如下思路进行Flex开发,也是按照MVC思路设计的。

1.写一个mxml文件和一个as文件,二者名称相同但是扩展名不同。
2.mxml文件作为视图和视图控制控制器(视图跳转、弹出的逻辑放在MXML文件中,因为子视图的弹出往往需要主视图作为参数),as文件作为model。model上定义视图所需要的数据和数据的处理逻辑(比如,获取远程的数据等)。mxml上的控件绑定model上的数据。model无需知道mxml,mxml在创建时需要引用model。
3.当用户操作界面发生请求需要处理数据时,mxml上的响应控件事件的处理函数调用model上的方法,改变数据,改变后的数据通过绑定功能自动地刷新界面(mxml所生成的swf)。
这样做的最大好处就是便于调试,其次是把视图部分和数据以及数据处理部分分离,当视图上的控件发生变化不会影响数据处理的业务。

具体的例子如下:

这是一个视图的MXML,用来实现通用“资源”选择。包括全选、反选,按下确定按钮就会返回已被选择的资源数据。这里的<MinizableTitleWindow>是一个自定义组件,可以帮它当做panel。

Code:
<?xml version="1.0" encoding="utf-8"?>
<MinizableTitleWindow
xmlns="com.xdfsoft.controls.*"
xmlns:mx="http://www.adobe.com/2006/mxml" width="500" height="400"
showMinimizeButton="false" title="资源选择">
<mx:Script>
<![CDATA[
import com.xdfsoft.right.model.ListResSelectModel;
[Bindable]
public var model:ListResSelectModel;

]]>
</mx:Script>
<mx:VBox width="100%" height="100%" verticalGap="0">
<mx:Canvas width="100%" height="100%">
<mx:DataGrid height="100%" width="100%" dataProvider="{this.model.resObjList}">
<mx:columns>
<mx:DataGridColumn headerText="选择" width="100" >
<mx:itemRenderer>
<mx:Component>
<mx:VBox horizontalAlign="center" verticalAlign="middle">
<mx:CheckBox click="{data.selected=!data.selected}" selected="{data.selected}" />
</mx:VBox>
</mx:Component>
</mx:itemRenderer>
</mx:DataGridColumn>
<mx:DataGridColumn headerText="资源编号" width="200" dataField="resourceObjectCode"/>
<mx:DataGridColumn headerText="资源名称" width="400" dataField="resourceObjectName"/>
</mx:columns>
</mx:DataGrid>
</mx:Canvas>
<mx:Canvas width="100%" height="12%">
<mx:Button x="283" y="7" label="确定" click="{this.model.doSelectOk(this);}"/>
<mx:Button x="358" y="7" label="取消" click="{this.model.doSelectCancel(this);}"/>
<mx:LinkButton x="18" y="10" color="blue" fontWeight="normal" textDecoration="underline" label="全选" click="{this.model.doSelectAll(1);}"/>
<mx:LinkButton x="70" y="10" color="blue" fontWeight="normal" textDecoration="underline" label="反向选择" click="{this.model.doSelectAll(2);}" />
<mx:LinkButton x="146" y="10" color="blue" fontWeight="normal" textDecoration="underline" label="清除选择" click="{this.model.doSelectAll(0);}"/>
</mx:Canvas>
</mx:VBox>
</MinizableTitleWindow>
上面视图MXML对应的AS类模型如下:

Code:
package com.xdfsoft.right.model
{
import com.xdfsoft.controls.MessageBox;
import flash.events.Event;
import flash.events.EventDispatcher;
import mx.collections.ArrayCollection;
import mx.core.IFlexDisplayObject;
import mx.managers.PopUpManager;
public class ListResSelectModel extends EventDispatcher
{
private var _resObjList:ArrayCollection=null;
private var _onSelectOk:Function;
private var _onSelectCancel:Function;
private var _otherArgs:Array;
public function ListResSelectModel(resObjList:ArrayCollection,onSelectOk:Function,onSelectCancel:Function=null,otherArgs:Array=null)
{
this.resObjList=resObjList;
this._onSelectOk=onSelectOk;
this._onSelectCancel=onSelectCancel;
this._otherArgs=otherArgs;
}
[Bindable(event="resObjListChange")]
public function get resObjList():ArrayCollection
{
return this._resObjList;
}

public function set resObjList(resObjList:ArrayCollection):void
{
if (this._resObjList==resObjList) return;
this._resObjList=resObjList;
dispatchEvent(new Event("resObjListChange"));

}
public function doSelectOk(window:IFlexDisplayObject):void
{
if (this._onSelectOk==null) return;
var selResObjs:Array=this.getSelectResObjs();
if (selResObjs.length==0)
{
MessageBox.note("请选择一个或者多个资源再执行此操作");
return;
}
var args:Array=this._otherArgs.concat();
args.splice(0,0,selResObjs);
this._onSelectOk.apply(this,args);
PopUpManager.removePopUp(window);
}
public function doSelectCancel(window:IFlexDisplayObject):void
{
if (this._onSelectCancel!=null)
{
this._onSelectCancel.apply(this);
}
PopUpManager.removePopUp(window);
}
private function getSelectResObjs():Array
{
var result:Array=new Array();
if (this.resObjList==null) return result;
for each(var resObj:ResourceObjVo in this.resObjList)
{
if (resObj.selected)
{
result.push(resObj);
}
}
return result;
}
public function doSelectAll(flag:int):void
{
for each(var resObj:ResourceObjVo in this.resObjList)
{
switch(flag)
{
case 0:
resObj.selected=false;
break;
case 1:
resObj.selected=true;
break;
case 2:
resObj.selected=!resObj.selected;
break;
}
}
}
}
}
除了这些之外,我觉得为了化简Flex的开发,大家可以自己动手造一些框架,比如说仿照Java Colleciton框架造AS下的Collection框架。造一个类库对远程调用进行封装,以简化远程调用。造一些常用窗口的MXML模板库,简化常用的维护、查询窗口的开发,.......通过构建这些针对应用开发中特定领域的框架对应用开发带来的简化远比用类似Cairongorm,pureMvc这些万能丹要好的多。我们需要的是开阔思路,不要被外国的轮子迷了眼,其实这些轮子代码不复杂,功能也不强大

这篇关于Flex框架选择的一点个人之见( 转)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/456160

相关文章

如何选择适合孤独症兄妹的学校?

在探索适合孤独症儿童教育的道路上,每一位家长都面临着前所未有的挑战与抉择。当这份责任落在拥有孤独症兄妹的家庭肩上时,选择一所能够同时满足两个孩子特殊需求的学校,更显得尤为关键。本文将探讨如何为这样的家庭做出明智的选择,并介绍星贝育园自闭症儿童寄宿制学校作为一个值得考虑的选项。 理解孤独症儿童的独特性 孤独症,这一复杂的神经发育障碍,影响着儿童的社交互动、沟通能力以及行为模式。对于拥有孤独症兄

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验

cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个?

跨平台系列 cross-plateform 跨平台应用程序-01-概览 cross-plateform 跨平台应用程序-02-有哪些主流技术栈? cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个? cross-plateform 跨平台应用程序-04-React Native 介绍 cross-plateform 跨平台应用程序-05-Flutte

Spring框架5 - 容器的扩展功能 (ApplicationContext)

private static ApplicationContext applicationContext;static {applicationContext = new ClassPathXmlApplicationContext("bean.xml");} BeanFactory的功能扩展类ApplicationContext进行深度的分析。ApplicationConext与 BeanF

如何选择SDR无线图传方案

在开源软件定义无线电(SDR)领域,有几个项目提供了无线图传的解决方案。以下是一些开源SDR无线图传方案: 1. **OpenHD**:这是一个远程高清数字图像传输的开源解决方案,它使用SDR技术来实现高清视频的无线传输。OpenHD项目提供了一个完整的工具链,包括发射器和接收器的硬件设计以及相应的软件。 2. **USRP(Universal Software Radio Periphera

数据治理框架-ISO数据治理标准

引言 "数据治理"并不是一个新的概念,国内外有很多组织专注于数据治理理论和实践的研究。目前国际上,主要的数据治理框架有ISO数据治理标准、GDI数据治理框架、DAMA数据治理管理框架等。 ISO数据治理标准 改标准阐述了数据治理的标准、基本原则和数据治理模型,是一套完整的数据治理方法论。 ISO/IEC 38505标准的数据治理方法论的核心内容如下: 数据治理的目标:促进组织高效、合理地

《数据结构(C语言版)第二版》第八章-排序(8.3-交换排序、8.4-选择排序)

8.3 交换排序 8.3.1 冒泡排序 【算法特点】 (1) 稳定排序。 (2) 可用于链式存储结构。 (3) 移动记录次数较多,算法平均时间性能比直接插入排序差。当初始记录无序,n较大时, 此算法不宜采用。 #include <stdio.h>#include <stdlib.h>#define MAXSIZE 26typedef int KeyType;typedef char In

ZooKeeper 中的 Curator 框架解析

Apache ZooKeeper 是一个为分布式应用提供一致性服务的软件。它提供了诸如配置管理、分布式同步、组服务等功能。在使用 ZooKeeper 时,Curator 是一个非常流行的客户端库,它简化了 ZooKeeper 的使用,提供了高级的抽象和丰富的工具。本文将详细介绍 Curator 框架,包括它的设计哲学、核心组件以及如何使用 Curator 来简化 ZooKeeper 的操作。 1

【Kubernetes】K8s 的安全框架和用户认证

K8s 的安全框架和用户认证 1.Kubernetes 的安全框架1.1 认证:Authentication1.2 鉴权:Authorization1.3 准入控制:Admission Control 2.Kubernetes 的用户认证2.1 Kubernetes 的用户认证方式2.2 配置 Kubernetes 集群使用密码认证 Kubernetes 作为一个分布式的虚拟