在Flex中,所有的ActionScript类可以根据是否可视分为两类:可视化组件和不可视组件。可视化组件都从mx.core.UICmponent继承,用于完成与用户的交互;不可视组件主要用来完成一些与人机交互无关的工作,大多数与数据处理相关,比如数据校验、格式化、远程数据访问等。
如果不可视化组件实现mx.core.IMXMLObject接口,当用MXML标记定义这个类的对象时,MXML编译器能够使该对象初始化。IMXMLObject接口非常简单,只要求该接口的实现类实现一个initialized(document:Object, id:String):void方法。一旦不可视组件实现了这个接口,那么在编译时,MXML编译器在创建该不可视类实例的ActionScript语句之后添加了一条调用initialized方法的ActionScript语句,使得在运行时实现IMXMLObject接口的不可视对象在其代码中能够访问它当前所在的文档对象。
解决问题:
1.根据权限来维护UI交互组件的状态
2.工作流驱动的界面中的UI交互组件,只有当前任务环节的UI交互组件才能够工作。
实例:在Flex中定义一个这样的Action组件,这样就在通用框架与具体人机界面的UI组件之间建立起一种隔离,使得通用框架不再控制具体的UI组件(耦合性降低),而只是控制Action的属性。UI组件只需要将自身属性(enabled和visible)与Action组件相对应的属性绑定即可以。
Action代码:
package com.st.sample
{
import mx.core.IMXMLObject;
[Bindable]
public class Action implements IMXMLObject
{
private var _id:String;
private var _document:Object;
public function Action()
{
}
public function initialized(document:Object, id:String):void
{
this._document = document;
this._id = id;
}
public function get id():String
{
return _id;
}
public function get document():Object
{
return _document;
}
public var operationCode:String;//对应权限中的操作码
public var caption:String; //绑定控件提供文字标签
public var visible:Boolean = true; //绑定控件提供visible属性
public var enabled:Boolean = true; //提供enabled属性
public var checked:Boolean = true; //提供checked属性
}
}
UIActions是一个专门存储Action组件的ArrayCollection派生类:
package com.st.sample
{
import mx.collections.ArrayCollection;
import mx.core.IMXMLObject;
[Bindable]
public class UIActions extends ArrayCollection
{
public function UIActions(source:Array=null)
{
super(source);
}
}
}
用途:
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600" xmlns:sample="com.st.sample.*">
<fx:Declarations>
<!-- Place non-visual elements (e.g., services, value objects) here -->
<sample:UIActions>
<sample:Action id="action_stat" caption="统计报表" operationCode="stat" enabled="false"/>
</sample:UIActions>
</fx:Declarations>
<s:Button x="123" y="124" label="发布报表" enabled="{this.action_stat.enabled}"/>
<s:Button x="271" y="124" label="统计报表"/>
</s:Application>