mate-objectbuilder

本文介绍了一种不依赖全局单例实例引用的数据管理方案。通过使用Mate框架,作者详细展示了如何在Flex应用中加载和处理XML数据,包括利用事件映射进行数据初始化和服务调用,以及如何将数据注入到视图组件。
OK!

I had time to play some with Mate and my example, and I finally got a scheme
that may just work without using a 'global' Singleton instance reference. Yes
I can be slow, but ...

So here is what I have:

1) Main MXML loading a MainUIViews MXML with a simple mx:List.
2) Main also has a MainEventMap MXML.
3) MainDataManager MXML to store system state data.
4) The normal other stuff like events, utilities, vos, etc...

So the MainEventMap first instantiates my MainDataModel into Mate's cache. This 
eliminates my need for the Singleton.getInatance() method, ...hopefully. Once 
instantiated, the XML data is ordered, HTTPServiceInvoker - here just an XML file.

//-------------------------------------------
<?xml version="1.0" encoding="utf-8"?>
<EventMap xmlns:mx="http://www.adobe.com/2006/mxml"
	xmlns="http://mate.asfusion.com/" >
	
	<mx:Script>
		<![CDATA[
			import views.*;
			import models.*;
			
			import mx.events.FlexEvent;
			import mx.collections.XMLListCollection;
			import mx.controls.Alert;
			
			// Event map local utility functions.
			private function XMLResultsConverter( xml:XML ):XMLListCollection
			{ return( new XMLListCollection(  xml..image ) ); }

			private function XMLServiceFault( fault:String ):Alert
			{ return Alert.show("Error: ...bad HTTP call. /n"+fault); }
		]]>
	</mx:Script>
	
	<Debugger level="{Debugger.ALL}" />

	<!-- FlexEvent.PREINITIALIZE -->
	<EventHandlers type="{FlexEvent.PREINITIALIZE}" debug="false" >
		<ObjectBuilder generator="{MainDataManager}" >
			<Properties globalDispatcher="{scope.dispatcher}" />
		</ObjectBuilder>
	</EventHandlers>

	<!-- FlexEvent.CREATION_COMPLETE -->
	<EventHandlers type="{FlexEvent.CREATION_COMPLETE}" debug="false" >
		<HTTPServiceInvoker id="get_XML_db" url="./image_db.xml"
				useProxy="false" resultFormat="e4x" debug="false" >
			<resultHandlers>
				<InlineInvoker method="XMLResultsConverter" arguments="{[resultObject]}" />
				<ObjectBuilder generator="{MainDataManager}" >
					<Properties XMLDataLC="{lastReturn}" />
				</ObjectBuilder>
			</resultHandlers>

			<faultHandlers>
				<InlineInvoker method="XMLServiceFault" arguments="{[fault]}" />
				<ObjectBuilder generator="{MainDataManager}" >
					<Properties alert="{lastReturn}" />
				</ObjectBuilder>
			</faultHandlers>
		</HTTPServiceInvoker>
	</EventHandlers>
		
	<!-- BINDINGS: XML Data Injector -->
	<Injectors target="{MainUIViews}" >
		<PropertyInjector targetKey="XMLDataLC" source="{MainDataManager}" sourceKey="XMLDataLC" />
	</Injectors>

</EventMap>
//-------------------------------------------

In the resultHandlers, I first use an InlineInvoker that simply converts the 
resultObject, XML, to an XMLListCollection that is passed along as the 
SmartObject, lastReturn. 

The next step is an ObjectBuilder using the cached MainDataModel to store this 
XMLListCollection. In the MainDataModel I used getters/setters and bind them:

[Bindable] public dynamic class MainDataManager implements IEventDispatcher
{
	//-------------------------------------------
	// Main UI views model data storage elements...
	private var _XMLDataLC:XMLListCollection;
	public function get XMLDataLC( ):XMLListCollection
	{ return _XMLDataLC as XMLListCollection; }
	public function set XMLDataLC( value:XMLListCollection ):void
	{ _XMLDataLC = value as XMLListCollection; }
	//-------------------------------------------

Now in the MainUIViews, I have added a bindable local variable, XMLDataLC, which 
is used as the data provider for my MX:List:

	<mx:Script>
		<![CDATA[
			import mx.collections.XMLListCollection;

			[Bindable] public var XMLDataLC:XMLListCollection = new XMLListCollection();
		]]>
	</mx:Script>
	
	<!-- Simple list of images -->
	<mx:List id="mainDataList" width="300" height="400"
		dataProvider="{XMLDataLC}" labelField="file" />
		
Finally, the injectors in the MainEventMap push the image file data into the list:

	<!-- BINDINGS: XML Data Injector -->
	<Injectors target="{MainUIViews}" >
		<PropertyInjector targetKey="XMLDataLC" source="{MainDataManager}" sourceKey="XMLDataLC" />
	</Injectors>


Well, so far, it all works thanks to the help that all have provided. TY

I hope that this is as it was meant.
Comments welcomed.


Greg


http://www.gypsytrader.com/mate/post01.txt
http://www.gypsytrader.com/mate/image_db.xml
给定的参考引用中未包含mate - session - manager的相关信息,以下是关于mate - session - manager的详细介绍及使用指南: ### 功能介绍 mate - session - manager是MATE桌面环境中用于管理会话的重要组件。它负责处理用户会话的各个方面,包括会话的启动、恢复和关闭。在用户登录时,mate - session - manager会启动一系列的应用程序和服务,构建用户的工作环境。当用户注销或系统关机时,它会妥善保存当前会话的状态,以便下次登录时可以恢复到之前的工作状态,比如打开的窗口、运行的程序等。 ### 使用方法 - **启动**:在MATE桌面环境下,mate - session - manager通常会在用户登录时自动启动,无需手动干预。 - **配置**:可以通过编辑配置文件来对mate - session - manager进行个性化设置。配置文件一般位于`~/.config/mate-session/`目录下。例如,要修改会话启动时自动运行的程序列表,可以编辑`autostart`文件夹中的相关文件。 - **手动控制会话**:可以使用命令行工具来手动控制会话。例如,要注销当前会话,可以使用`mate-session-save --logout`命令;要关闭系统,可以使用`mate-session-save --shutdown-dialog`命令。 ### 常见问题及解决办法 - **会话无法恢复**:可能是配置文件损坏或权限问题。可以尝试删除`~/.config/mate-session/`目录下的相关文件,然后重新登录,让系统重新生成配置文件。 - **会话启动缓慢**:可能是自动启动的程序过多或某些程序启动时间过长。可以通过编辑`~/.config/mate-session/autostart`文件夹中的文件,禁用不必要的自动启动程序。 - **mate - session - manager崩溃**:可能是软件版本不兼容或依赖库缺失。可以尝试更新MATE桌面环境到最新版本,或者检查并安装缺失的依赖库。 ### 代码示例 以下是一个简单的脚本示例,用于在会话启动时自动运行一个自定义程序: ```bash #!/bin/bash # 创建一个自动启动配置文件 cat << EOF > ~/.config/autostart/custom-program.desktop [Desktop Entry] Type=Application Exec=/path/to/your/program Hidden=false NoDisplay=false X-GNOME-Autostart-enabled=true Name=Custom Program Comment=Run a custom program at session startup EOF ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值