﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-云自无心水自闲-随笔分类-Cairngorm</title><link>http://www.blogjava.net/usherlight/category/18754.html</link><description>天平山上白云泉，云自无心水自闲。何必奔冲山下去，更添波浪向人间！</description><language>zh-cn</language><lastBuildDate>Tue, 10 Apr 2007 12:05:03 GMT</lastBuildDate><pubDate>Tue, 10 Apr 2007 12:05:03 GMT</pubDate><ttl>60</ttl><item><title>整理了一下Cairngorm 2.1版本的新变化</title><link>http://www.blogjava.net/usherlight/archive/2007/04/10/109722.html</link><dc:creator>云自无心水自闲</dc:creator><author>云自无心水自闲</author><pubDate>Tue, 10 Apr 2007 11:48:00 GMT</pubDate><guid>http://www.blogjava.net/usherlight/archive/2007/04/10/109722.html</guid><wfw:comment>http://www.blogjava.net/usherlight/comments/109722.html</wfw:comment><comments>http://www.blogjava.net/usherlight/archive/2007/04/10/109722.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/usherlight/comments/commentRss/109722.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/usherlight/services/trackbacks/109722.html</trackback:ping><description><![CDATA[<p>1. Caringorm2.1的包中增加了完整的ASDoc文档</p>
<p>2. 增加Locale，错误信息的国际化的处理。<br>添加了一个Properties文件，<br>添加了com.adobe.cairngorm.CairngormMessageCodes和com.adobe.cairngorm.CairngormError两个类，其中CairngormMessageCodes用于定义Properties文件中的键值，而CairngormError封装了Error，在应用执行的过程不再直接抛出Error，而抛出一个CairngormError，其中带一个参数就是MessageCode，根据MessageCode到Properties文件中取出相应的消息。</p>
<p>3. 在business中，添加了一个IServiceLocator的接口<br>ServiceLocator实现IServiceLocator接口，相比以前增加了以下几个方法：<br>a、public function getRemoteObject( serviceId : String ) : RemoteObject // Return the RemoteObject for the given service id.<br>b、public function getHTTPService( serviceId : String ) : HTTPService // Return the HTTPService for the given service id.<br>c、public function getWebService( serviceId : String ) : WebService // Return the WebService for the given service id.<br>d、public function getConsumer( serviceId : String ) : Consumer&nbsp; // Return the message Consumer for the given service id.<br>e、public function getProducer( serviceId : String ) : Producer // Return the message Produce for the given service id.<br>f、public function getDataService( serviceId : String ) : DataService // Return the DataService for the given service id.<br>g、public function setCredentials( username : String, password : String ) : void // Set the credentials for all registered services. Note that services that use a proxy or a third-party adapter to a remote endpoint will</p>
<p>原来的getService和getInvokerService方法已经废弃，改为了getRemoteObject</p>
<p>4. 在Command中，增加了ICommand接口，原来的Command接口继承ICommand</p>
<p>5. 在VO中，增加了IValueObject接口，原来的ValueObject继承IValueObject接口</p>
<p>上面添加的几个接口，除了IServiceLocator相较2.0版本有了较大的变化，增加了一些方法，其他的几个接口，依我所见，纯粹是换了名字而已。</p>
<p>&nbsp;</p><img src ="http://www.blogjava.net/usherlight/aggbug/109722.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/usherlight/" target="_blank">云自无心水自闲</a> 2007-04-10 19:48 <a href="http://www.blogjava.net/usherlight/archive/2007/04/10/109722.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个Cairngorm的代码生成器</title><link>http://www.blogjava.net/usherlight/archive/2007/03/24/106000.html</link><dc:creator>云自无心水自闲</dc:creator><author>云自无心水自闲</author><pubDate>Fri, 23 Mar 2007 16:13:00 GMT</pubDate><guid>http://www.blogjava.net/usherlight/archive/2007/03/24/106000.html</guid><wfw:comment>http://www.blogjava.net/usherlight/comments/106000.html</wfw:comment><comments>http://www.blogjava.net/usherlight/archive/2007/03/24/106000.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/usherlight/comments/commentRss/106000.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/usherlight/services/trackbacks/106000.html</trackback:ping><description><![CDATA[<p>Caringen是一个Eric Feminella自己开发的一个小工具. 现在他把这个工具共享出来.<br />Cairngen并不能让所有的人解决所有的问题, 它只是简单地加快开发的过程. </p>
		<p>Cairngen是一个Caringorm的代码生成器, 它使得开发者可以很方便地生成Cairngorm项目的结构框架, 包括: Cairngorm项目的目录结构, 一个缺省的ModelLocator, Controller, ServiceLocator. Cairngen也可以生成Event, Command, Delegate类. </p>
		<p>Cairngen使用Flex2和PHP5.2.0开发, 利用了AMFPHP. 安装过程十分方便. 你可以在Flex Builder的浏览器中直接运行Cairngen来快速方便地生成Cairngorm的类. </p>
		<p>Cairngen使用'步骤(Sequence)'来描述Event, Command, Delegate类之间的关系. <br />在Cairngen中只要命名一个'步骤',点击一下生成按钮就可以生成一个'步骤'. 然后刷新一下Flex项目, 生成的类就OK了. 在一些特殊的情况下, 你不希望添加Delegate类, 那么你可以选择排除Delegate类的生成, 这样的话, Cairngen只生成Event和Command.<br />生成的Command类实现Cairngorm的Command接口, 但不实现IResponder接口. Cairngen还能够正确地将事件强制性转化(casting)为Coand中的类型, 并import所有相关的类.</p>
		<p>系统需求:<br />1. 了解AMFPHP, Apache2.0.59和PHP5.2.0, 在使用Cairngen之前要求先安装AMFPHP, 而且gateway.php的访问虚拟目录应该如下设置: <a href="http://localhost/amfphp/gateway.php">http://localhost/amfphp/gateway.php</a>. 在1.0版正式发布后, 这个URL可以自由配置.<br />2. 还需要安装Flex2, PHP, 你可以用WAMP5来集成安装Apache5.5和PHP. 安装好PHP和AMFPHP后, 就可以解压缩Cairngen Alpha 1. 把services目录复制到amfphp的根目录下. 然后复制cairgen-ui目录到apache的www根目录下.</p>
		<p>使用:<br />安装好PHP和AMFPHP后, 就可以开始使用Cairngen了. 打开浏览器输入<a href="http://localhost/cairngen-ui/Cairngen.html">http://localhost/cairngen-ui/Cairngen.html</a>打开生成器的图形界面. 创建Cairgen项目:<br />点击 begin<br />给你的Cairngen项目命名. 这个名称与Flex项目的名称相同, 选择你的Cairngorm的版本, 选择Flex项目的路径. 设置项目中包路径(比如: com.domain.projectname). 最后, 检验一下输入内容, 点击"Create Project". 刷新Flex项目查看缺省的Cairngorm项目结构, ModelLocator, Service和Controller类.</p>
		<p>创建"步骤":</p>
		<p>首先是给步骤命名, 然后选择是否要生成Delegate类, 点击生成, 并刷新Flex项目. 可以发现需要的类已经生成完毕了. 现在需要把它们添加到Controller中.<br />接下来编辑模板文件: 你可以修改模板文件(.tpl)来实现你的特定的Cairngorm需求; 模板文件在 amfphp\services\com\ericfeminella\cairngen\templates目录下.<br /><br />生成器下载地址: <a href="http://code.ericfeminella.com/cairngen/Cairngen%20Alpha%201%20PreRelease.zip">http://code.ericfeminella.com/cairngen/Cairngen%20Alpha%201%20PreRelease.zip</a></p><img src ="http://www.blogjava.net/usherlight/aggbug/106000.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/usherlight/" target="_blank">云自无心水自闲</a> 2007-03-24 00:13 <a href="http://www.blogjava.net/usherlight/archive/2007/03/24/106000.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>编写ActionScript3.0中需要注意的10个问题</title><link>http://www.blogjava.net/usherlight/archive/2007/01/26/96236.html</link><dc:creator>云自无心水自闲</dc:creator><author>云自无心水自闲</author><pubDate>Fri, 26 Jan 2007 15:58:00 GMT</pubDate><guid>http://www.blogjava.net/usherlight/archive/2007/01/26/96236.html</guid><wfw:comment>http://www.blogjava.net/usherlight/comments/96236.html</wfw:comment><comments>http://www.blogjava.net/usherlight/archive/2007/01/26/96236.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/usherlight/comments/commentRss/96236.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/usherlight/services/trackbacks/96236.html</trackback:ping><description><![CDATA[<p>总结起来需要注意的原则就是：尽量在编译的阶段发现错误，因为这时发现并解决错误远远要比在运行时出错解决起来容易的多。可是实际情况中很多人经常会违反这一原则，下面是我列举的10个技巧:<br /><br />1) 永远不要使用'Object' 来存储数据. 因为这是一种绕开编译器检查的做法，完全不符合面向对象的思想。如果要用Hashmap或者相应的数组，那么可以用Dictionary。否则，请自已定义一个类，而不要使用Object来作为数据的存储器。<br /><br />2) 不要用Object来作为对象的类型。这是欺骗编译器的方法。如果必须这样用，最好在存取属性或者调用函数时，先进行强制性的类型转换，至少这是给编译器的一个提示，也帮助其他人理解你的代码。</p>
		<p>3) 也不要用*类型。</p>
		<p>4) 不要将ActionScript的类声明为动态。</p>
		<p>5) 注意Application.application (和其他的无类型的框架属性). 这个属性有一些古怪.  他应该是Applicaton类型的，因为他指向的实例必须是Application的子类. 但实际上他的类型是'Object', 无法应用编译时的检查。如果你一定要用，最好也进行类型的强制性转换。:</p>
		<blockquote>
				<p>MyApplication( Application.application ).functionCall();</p>
		</blockquote>
		<p>6) 封装你的Xml。使用Xml与Server进行数据的交互非常方便，但是尽量避免使用Xml作为核心数据模型。从服务器收到数据后，尽量把Xml转换为强类型的对象模型。在Flex应用内部使用Xml是绕开编译器的作法。 </p>
		<p>7) 不要使用DynamicEvent. </p>
		<p>8) 不要使用mx:Model。如上所述，请尽量使用自定义的强类型的类.</p>
		<p>9) 不要使用Cairngorm中的data属性，而应该继承扩展CairngormEvent来传递数据。</p>
		<p>10) 不要把编译器的严格模式关掉</p><img src ="http://www.blogjava.net/usherlight/aggbug/96236.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/usherlight/" target="_blank">云自无心水自闲</a> 2007-01-26 23:58 <a href="http://www.blogjava.net/usherlight/archive/2007/01/26/96236.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Changes between Cairngorm 2.1 and Cairngorm 2.2 Beta</title><link>http://www.blogjava.net/usherlight/archive/2007/01/25/96040.html</link><dc:creator>云自无心水自闲</dc:creator><author>云自无心水自闲</author><pubDate>Thu, 25 Jan 2007 13:08:00 GMT</pubDate><guid>http://www.blogjava.net/usherlight/archive/2007/01/25/96040.html</guid><wfw:comment>http://www.blogjava.net/usherlight/comments/96040.html</wfw:comment><comments>http://www.blogjava.net/usherlight/archive/2007/01/25/96040.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/usherlight/comments/commentRss/96040.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/usherlight/services/trackbacks/96040.html</trackback:ping><description><![CDATA[The major change to this release is how <span class="st" id="st" name="st">Cairngorm</span> is being packaged. <span class="st" id="st" name="st">Cairngorm</span> 2.1 introduced a dependency on fds.swc, which isn't part of the standard Flex SDK - it is part of FDS. So, we've repackaged <span class="st" id="st" name="st">Cairngorm</span> into the core <span class="st" id="st" name="st">Cairngorm</span> and <span class="st" id="st" name="st">Cairngorm</span> Enterprise - this also starts aligning <span class="st" id="st" name="st">Cairngorm</span> with Steven Webster's presentation at Max when he spoke about the <span class="st" id="st" name="st">Cairngorm</span> Roadmap. We're also now going to to distribute <span class="st" id="st" name="st">Cairngorm</span> in Binary form (SWC), as a source zip and a documentation zip.<br /><br />* Removed dependency on Flex Data Services (fds.swc) - externalised to <span class="st" id="st" name="st">Cairngorm</span> Enterprise<br />* Flex SDK SWCs are no longer linked into <span class="st" id="st" name="st">Cairngorm</span>.swc (produces a smaller <span class="st" id="st" name="st">cairngorm</span>.swc)<br />* Added support for setting remote credentials<br />* Fixed bug with Web services not loading the WSDL (no need to call loadWSDL() explicitly)<br />* ModelLocator interface has been deprecated. Added com.adobe.<span class="st" id="st" name="st">cairngorm</span>.model.IModelLocator<br />* Added deprecation metadata for compiler support<br /><br />对于我来说，关注的只有一点：ModelLocator被改成IModelLocator了。<br />其他的只是Cairngorm的打包方式而已。<br />Cairngorm2.1中依赖于fds.swc，而fds.swc不是Flex SDK中的东西，是FDS的一部分。<br />在2.2中会将Cairngorm拆成两部分：Core Cairngorm和Cairngorm Enterprise<br />和FDS.swc相关的部分放入Cairngorm Enterprise中。<img src ="http://www.blogjava.net/usherlight/aggbug/96040.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/usherlight/" target="_blank">云自无心水自闲</a> 2007-01-25 21:08 <a href="http://www.blogjava.net/usherlight/archive/2007/01/25/96040.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Cairngorm中Model数据变化后如何自动调用一个自定义函数？</title><link>http://www.blogjava.net/usherlight/archive/2007/01/07/92181.html</link><dc:creator>云自无心水自闲</dc:creator><author>云自无心水自闲</author><pubDate>Sat, 06 Jan 2007 18:15:00 GMT</pubDate><guid>http://www.blogjava.net/usherlight/archive/2007/01/07/92181.html</guid><wfw:comment>http://www.blogjava.net/usherlight/comments/92181.html</wfw:comment><comments>http://www.blogjava.net/usherlight/archive/2007/01/07/92181.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/usherlight/comments/commentRss/92181.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/usherlight/services/trackbacks/92181.html</trackback:ping><description><![CDATA[<p> </p>
		<p>在Flex的开发过程中，尤其是在使用Cairngorm的时候，总会遇到需要在Model的属性值改变后，需要调用一个指定的函数。传统的解决方法是使用一个Setter方法，在这个方法中首先对属性赋值，然后调用指定的函数，比如：</p>
		<p>---------------------------<br />[ChangeEvent("deleteEnabledChange")]<br />public function get deleteEnabled() : Boolean {<br />return _deleteButtonVisible;<br />}</p>
		<p>public function set deleteEnabled(value : Boolean) : Void {<br />_deleteButtonVisible = value;<br />SimpleButton(deleteButton)._visible = false;<br />dispatchEvent(new Event("deleteEnabledChange", this));<br />}<br />--------------</p>
		<p>但是现在我们有一个更简洁的解决之道<br />首先添加这样一个类<br />package com.adobe.ac.util <br />{ <br />   public class Observe <br />   { <br />      public var handler : Function; <br /> <br />      public function set source( source : * ) : void <br />      { <br />         handler.call(); <br />      } <br />   } <br />}<br />然后就可以使用这个作为标签了。<br />&lt;util:Observe source="{ model.myProperty }" <br />              handler="{ this.myFunction }"/&gt;<br />使用了这样的一个标签后，今后嘦是对model.myProperty进行赋值，就会调用myFunction<br />这个号称世上最小的标签是不是很好用啊？<br /></p><img src ="http://www.blogjava.net/usherlight/aggbug/92181.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/usherlight/" target="_blank">云自无心水自闲</a> 2007-01-07 02:15 <a href="http://www.blogjava.net/usherlight/archive/2007/01/07/92181.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Cairngorm示例--业务逻辑如何管理视图（III）</title><link>http://www.blogjava.net/usherlight/archive/2006/12/29/90621.html</link><dc:creator>云自无心水自闲</dc:creator><author>云自无心水自闲</author><pubDate>Thu, 28 Dec 2006 16:36:00 GMT</pubDate><guid>http://www.blogjava.net/usherlight/archive/2006/12/29/90621.html</guid><wfw:comment>http://www.blogjava.net/usherlight/comments/90621.html</wfw:comment><comments>http://www.blogjava.net/usherlight/archive/2006/12/29/90621.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/usherlight/comments/commentRss/90621.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/usherlight/services/trackbacks/90621.html</trackback:ping><description><![CDATA[<p>现在我们将增加验证、格式化和一些其他的功能。<br />第四次迭代--添加功能<br />现在我们回过头来看那个单视图的应用，增加一点真实性，我们模拟一下远程服务有一点延时。我们在Delegate中使用flash.utils.setTimeOut来模拟延时。<br />通常，当远程服务在处理时，UI会展现一个进度条，禁用一部分控件，让用户明白不能再派发新的请求。在我们的例子中在远程服务在处理的时候，我们会禁用“Get Quote”按钮。完成这一点很容易，只需要在Model对象的StockQuote类中增加一个成员isPending，把它定义为一个bool形，这样可以直接应用于绑定。</p>
		<p> </p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #000000">[Bindable]<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000"> var isPending : Boolean;</span>
		</div>
		<p> </p>
		<p>增加验证<br />我们现在添加对股票报价的验证功能，对于这一点，我们可以使用mx.validators.StringValidator来完成这一功能。应用中这两个参数共同控制按钮的有效性。这样可以在Model对象中设置一个isValid属性，用于组合这两参数。<br /></p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #0000ff">private</span>
				<span style="COLOR: #000000"> function validate() : </span>
				<span style="COLOR: #0000ff">void</span>
				<span style="COLOR: #000000">
						<br />
						<img id="Codehighlighter1_35_81_Open_Image" onclick="this.style.display='none'; Codehighlighter1_35_81_Open_Text.style.display='none'; Codehighlighter1_35_81_Closed_Image.style.display='inline'; Codehighlighter1_35_81_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
						<img id="Codehighlighter1_35_81_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_35_81_Closed_Text.style.display='none'; Codehighlighter1_35_81_Open_Image.style.display='inline'; Codehighlighter1_35_81_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />
				</span>
				<span id="Codehighlighter1_35_81_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.blogjava.net/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_35_81_Open_Text">
						<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    isValid </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> ( isSymbolValid </span>
						<span style="COLOR: #000000">&amp;&amp;</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">!</span>
						<span style="COLOR: #000000">isPending );<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
				</span>
		</div>
		<p>isSymbolValid是一个属性，存放StringValidator的结果。<br />在StockMarketPod.mxml中添加mx:StringValidator这个Tag<br /></p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #0000ff">&lt;</span>
				<span style="COLOR: #800000">mx:StringValidator <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span>
				<span style="COLOR: #ff0000">minLength</span>
				<span style="COLOR: #0000ff">="2"</span>
				<span style="COLOR: #ff0000"> triggerEvent</span>
				<span style="COLOR: #0000ff">="change"</span>
				<span style="COLOR: #ff0000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    source</span>
				<span style="COLOR: #0000ff">="{ symbolTextInput }"</span>
				<span style="COLOR: #ff0000"> property</span>
				<span style="COLOR: #0000ff">="text"</span>
				<span style="COLOR: #ff0000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    valid</span>
				<span style="COLOR: #0000ff">="stockQuote.validateSymbol( true );"</span>
				<span style="COLOR: #ff0000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    invalid</span>
				<span style="COLOR: #0000ff">="stockQuote.validateSymbol( false );"</span>
				<span style="COLOR: #0000ff">/&gt;</span>
		</div>
		<p>
				<br />从视图中直接调用Model对象不符合MVC原则，因为视图原则上只能派发事件。但在这个例子中，这样已经足够好了。</p>
		<p>增加格式化<br />我们将股票报价以金额的方式进行展示，在StockMarketPod.mxml中增加一个formatter<br /></p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #0000ff">&lt;</span>
				<span style="COLOR: #800000">mx:CurrencyFormatter <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span>
				<span style="COLOR: #ff0000">id</span>
				<span style="COLOR: #0000ff">="standardEuroFormatter"</span>
				<span style="COLOR: #ff0000">  <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    currencySymbol</span>
				<span style="COLOR: #0000ff">="$"</span>
				<span style="COLOR: #ff0000"> precision</span>
				<span style="COLOR: #0000ff">="2"</span>
				<span style="COLOR: #0000ff">/&gt;</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />将formatter的结果进行绑定<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #0000ff">&lt;</span>
				<span style="COLOR: #800000">mx:Label </span>
				<span style="COLOR: #ff0000">text</span>
				<span style="COLOR: #0000ff">="{ standardEuroFormatter.format( stockQuote.lastStockQuote ) }"</span>
				<span style="COLOR: #0000ff">/&gt;</span>
		</div>
		<p>
				<br />现在看一下完整的StockQuote类<br /></p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #0000ff">package</span>
				<span style="COLOR: #000000"> com.adobe.cairngorm.samples.dashboard.model<br /><img id="Codehighlighter1_52_734_Open_Image" onclick="this.style.display='none'; Codehighlighter1_52_734_Open_Text.style.display='none'; Codehighlighter1_52_734_Closed_Image.style.display='inline'; Codehighlighter1_52_734_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_52_734_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_52_734_Closed_Text.style.display='none'; Codehighlighter1_52_734_Open_Image.style.display='inline'; Codehighlighter1_52_734_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span>
				<span id="Codehighlighter1_52_734_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.blogjava.net/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_52_734_Open_Text">
						<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">public</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">class</span>
						<span style="COLOR: #000000"> StockQuote<br /><img id="Codehighlighter1_80_732_Open_Image" onclick="this.style.display='none'; Codehighlighter1_80_732_Open_Text.style.display='none'; Codehighlighter1_80_732_Closed_Image.style.display='inline'; Codehighlighter1_80_732_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_80_732_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_80_732_Closed_Text.style.display='none'; Codehighlighter1_80_732_Open_Image.style.display='inline'; Codehighlighter1_80_732_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span>
						<span id="Codehighlighter1_80_732_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.blogjava.net/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_80_732_Open_Text">
								<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        [Bindable]<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span>
								<span style="COLOR: #0000ff">public</span>
								<span style="COLOR: #000000"> var lastStockQuote : Number;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        [Bindable]<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span>
								<span style="COLOR: #0000ff">public</span>
								<span style="COLOR: #000000"> var isValid : Boolean;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        [Bindable]<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span>
								<span style="COLOR: #0000ff">public</span>
								<span style="COLOR: #000000"> var statusMessage : String;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />                <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span>
								<span style="COLOR: #0000ff">private</span>
								<span style="COLOR: #000000"> var _isPending : Boolean;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span>
								<span style="COLOR: #0000ff">private</span>
								<span style="COLOR: #000000"> var isSymbolValid : Boolean;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />                <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        [Bindable]<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span>
								<span style="COLOR: #0000ff">public</span>
								<span style="COLOR: #000000"> function get isPending() : Boolean<br /><img id="Codehighlighter1_384_410_Open_Image" onclick="this.style.display='none'; Codehighlighter1_384_410_Open_Text.style.display='none'; Codehighlighter1_384_410_Closed_Image.style.display='inline'; Codehighlighter1_384_410_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_384_410_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_384_410_Closed_Text.style.display='none'; Codehighlighter1_384_410_Open_Image.style.display='inline'; Codehighlighter1_384_410_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        </span>
								<span id="Codehighlighter1_384_410_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
										<img src="http://www.blogjava.net/images/dot.gif" />
								</span>
								<span id="Codehighlighter1_384_410_Open_Text">
										<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            </span>
										<span style="COLOR: #0000ff">return</span>
										<span style="COLOR: #000000"> _isPending;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />        }</span>
								</span>
								<span style="COLOR: #000000">
										<br />
										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span>
								<span style="COLOR: #0000ff">public</span>
								<span style="COLOR: #000000"> function set isPending( value : Boolean ) : </span>
								<span style="COLOR: #0000ff">void</span>
								<span style="COLOR: #000000">
										<br />
										<img id="Codehighlighter1_475_517_Open_Image" onclick="this.style.display='none'; Codehighlighter1_475_517_Open_Text.style.display='none'; Codehighlighter1_475_517_Closed_Image.style.display='inline'; Codehighlighter1_475_517_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
										<img id="Codehighlighter1_475_517_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_475_517_Closed_Text.style.display='none'; Codehighlighter1_475_517_Open_Image.style.display='inline'; Codehighlighter1_475_517_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        </span>
								<span id="Codehighlighter1_475_517_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
										<img src="http://www.blogjava.net/images/dot.gif" />
								</span>
								<span id="Codehighlighter1_475_517_Open_Text">
										<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            _isPending </span>
										<span style="COLOR: #000000">=</span>
										<span style="COLOR: #000000"> value;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            validate();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />        }</span>
								</span>
								<span style="COLOR: #000000">
										<br />
										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span>
								<span style="COLOR: #0000ff">public</span>
								<span style="COLOR: #000000"> function validateSymbol( isValid : Boolean ) : </span>
								<span style="COLOR: #0000ff">void</span>
								<span style="COLOR: #000000">
										<br />
										<img id="Codehighlighter1_586_633_Open_Image" onclick="this.style.display='none'; Codehighlighter1_586_633_Open_Text.style.display='none'; Codehighlighter1_586_633_Closed_Image.style.display='inline'; Codehighlighter1_586_633_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
										<img id="Codehighlighter1_586_633_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_586_633_Closed_Text.style.display='none'; Codehighlighter1_586_633_Open_Image.style.display='inline'; Codehighlighter1_586_633_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        </span>
								<span id="Codehighlighter1_586_633_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
										<img src="http://www.blogjava.net/images/dot.gif" />
								</span>
								<span id="Codehighlighter1_586_633_Open_Text">
										<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            isSymbolValid </span>
										<span style="COLOR: #000000">=</span>
										<span style="COLOR: #000000"> isValid;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            validate();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />        }</span>
								</span>
								<span style="COLOR: #000000">
										<br />
										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span>
								<span style="COLOR: #0000ff">private</span>
								<span style="COLOR: #000000"> function validate() : </span>
								<span style="COLOR: #0000ff">void</span>
								<span style="COLOR: #000000">
										<br />
										<img id="Codehighlighter1_677_727_Open_Image" onclick="this.style.display='none'; Codehighlighter1_677_727_Open_Text.style.display='none'; Codehighlighter1_677_727_Closed_Image.style.display='inline'; Codehighlighter1_677_727_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
										<img id="Codehighlighter1_677_727_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_677_727_Closed_Text.style.display='none'; Codehighlighter1_677_727_Open_Image.style.display='inline'; Codehighlighter1_677_727_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        </span>
								<span id="Codehighlighter1_677_727_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
										<img src="http://www.blogjava.net/images/dot.gif" />
								</span>
								<span id="Codehighlighter1_677_727_Open_Text">
										<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            isValid </span>
										<span style="COLOR: #000000">=</span>
										<span style="COLOR: #000000"> ( isSymbolValid </span>
										<span style="COLOR: #000000">&amp;&amp;</span>
										<span style="COLOR: #000000"> </span>
										<span style="COLOR: #000000">!</span>
										<span style="COLOR: #000000">isPending );<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />        }</span>
								</span>
								<span style="COLOR: #000000">        <br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span>
						</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
				</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
		</div>
		<p>其中isPending属性的值由GetStockQuoteCommand控制<br /></p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #0000ff">private</span>
				<span style="COLOR: #000000"> var model : ModelLocator </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> ModelLocator.getInstance();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #0000ff">private</span>
				<span style="COLOR: #000000"> var stockQuote : StockQuote </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> model.stockQuote;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />         <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000"> function execute( event : CairngormEvent ) : </span>
				<span style="COLOR: #0000ff">void</span>
				<span style="COLOR: #000000">
						<br />
						<img id="Codehighlighter1_180_461_Open_Image" onclick="this.style.display='none'; Codehighlighter1_180_461_Open_Text.style.display='none'; Codehighlighter1_180_461_Closed_Image.style.display='inline'; Codehighlighter1_180_461_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
						<img id="Codehighlighter1_180_461_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_180_461_Closed_Text.style.display='none'; Codehighlighter1_180_461_Open_Image.style.display='inline'; Codehighlighter1_180_461_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />
				</span>
				<span id="Codehighlighter1_180_461_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.blogjava.net/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_180_461_Open_Text">
						<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    stockQuote.isPending </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">true</span>
						<span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />             <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    var stockQuoteEvent : GetStockQuoteEvent </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> GetStockQuoteEvent( event );          <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    var symbol : String </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> stockQuoteEvent.symbol;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    var delegate : StockMarketDelegate </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">new</span>
						<span style="COLOR: #000000"> StockMarketDelegate( </span>
						<span style="COLOR: #0000ff">this</span>
						<span style="COLOR: #000000"> );<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    delegate.getQuoteForSymbol( symbol );    <br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
				</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000"> function onResult( event : </span>
				<span style="COLOR: #000000">*</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">null</span>
				<span style="COLOR: #000000"> ) : </span>
				<span style="COLOR: #0000ff">void</span>
				<span style="COLOR: #000000">
						<br />
						<img id="Codehighlighter1_518_722_Open_Image" onclick="this.style.display='none'; Codehighlighter1_518_722_Open_Text.style.display='none'; Codehighlighter1_518_722_Closed_Image.style.display='inline'; Codehighlighter1_518_722_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
						<img id="Codehighlighter1_518_722_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_518_722_Closed_Text.style.display='none'; Codehighlighter1_518_722_Open_Image.style.display='inline'; Codehighlighter1_518_722_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />
				</span>
				<span id="Codehighlighter1_518_722_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.blogjava.net/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_518_722_Open_Text">
						<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #008000">//</span>
						<span style="COLOR: #008000">for demo purpose: event would normally be an event object of remote service result.            </span>
						<span style="COLOR: #008000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
						</span>
						<span style="COLOR: #000000">    stockQuote.lastStockQuote </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> event as Number;            <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    stockQuote.isPending </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">false</span>
						<span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    stockQuote.statusMessage </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">""</span>
						<span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
				</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000"> function onFault( event : </span>
				<span style="COLOR: #000000">*</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">null</span>
				<span style="COLOR: #000000"> ) : </span>
				<span style="COLOR: #0000ff">void</span>
				<span style="COLOR: #000000">
						<br />
						<img id="Codehighlighter1_778_899_Open_Image" onclick="this.style.display='none'; Codehighlighter1_778_899_Open_Text.style.display='none'; Codehighlighter1_778_899_Closed_Image.style.display='inline'; Codehighlighter1_778_899_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
						<img id="Codehighlighter1_778_899_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_778_899_Closed_Text.style.display='none'; Codehighlighter1_778_899_Open_Image.style.display='inline'; Codehighlighter1_778_899_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />
				</span>
				<span id="Codehighlighter1_778_899_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.blogjava.net/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_778_899_Open_Text">
						<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    stockQuote.lastStockQuote </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> NaN;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    stockQuote.statusMessage </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">Quote retrieval error.</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    stockQuote.isPending </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">false</span>
						<span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
				</span>
		</div>
		<p>最后看一下StockMarketPod.mxml的全部代码<br /></p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #0000ff">&lt;?</span>
				<span style="COLOR: #ff00ff">xml version="1.0" encoding="utf-8"</span>
				<span style="COLOR: #0000ff">?&gt;</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">&lt;</span>
				<span style="COLOR: #800000">mx:Panel <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span>
				<span style="COLOR: #ff0000">xmlns:mx</span>
				<span style="COLOR: #0000ff">="http://www.adobe.com/2006/mxml"</span>
				<span style="COLOR: #ff0000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    xmlns:util</span>
				<span style="COLOR: #0000ff">="com.adobe.cairngorm.samples.dashboard.util.*"</span>
				<span style="COLOR: #0000ff">&gt;</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span>
				<span style="COLOR: #0000ff">&lt;</span>
				<span style="COLOR: #800000">mx:Script</span>
				<span style="COLOR: #0000ff">&gt;</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span>
				<span style="COLOR: #0000ff">&lt;![CDATA[</span>
				<span style="COLOR: #808080">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            import com.adobe.cairngorm.control.CairngormEventDispatcher;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            import com.adobe.cairngorm.samples.dashboard.model.StockQuote;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            import com.adobe.cairngorm.samples.dashboard.events.GetStockQuoteEvent;    <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            [Bindable]<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            public var stockQuote : StockQuote;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            private function getQuoteForSymbol() : void<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            {<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />                var event : GetStockQuoteEvent = new GetStockQuoteEvent( symbolTextInput.text );<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />                CairngormEventDispatcher.getInstance().dispatchEvent( event );<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            }<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span>
				<span style="COLOR: #0000ff">]]&gt;</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span>
				<span style="COLOR: #0000ff">&lt;/</span>
				<span style="COLOR: #800000">mx:Script</span>
				<span style="COLOR: #0000ff">&gt;</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span>
				<span style="COLOR: #0000ff">&lt;</span>
				<span style="COLOR: #800000">mx:CurrencyFormatter <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />                </span>
				<span style="COLOR: #ff0000">id</span>
				<span style="COLOR: #0000ff">="standardEuroFormatter"</span>
				<span style="COLOR: #ff0000">  <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        currencySymbol</span>
				<span style="COLOR: #0000ff">="$"</span>
				<span style="COLOR: #ff0000"> precision</span>
				<span style="COLOR: #0000ff">="2"</span>
				<span style="COLOR: #0000ff">/&gt;</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span>
				<span style="COLOR: #0000ff">&lt;</span>
				<span style="COLOR: #800000">mx:StringValidator <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span>
				<span style="COLOR: #ff0000">minLength</span>
				<span style="COLOR: #0000ff">="2"</span>
				<span style="COLOR: #ff0000"> triggerEvent</span>
				<span style="COLOR: #0000ff">="change"</span>
				<span style="COLOR: #ff0000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        source</span>
				<span style="COLOR: #0000ff">="{ symbolTextInput }"</span>
				<span style="COLOR: #ff0000"> property</span>
				<span style="COLOR: #0000ff">="text"</span>
				<span style="COLOR: #ff0000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        valid</span>
				<span style="COLOR: #0000ff">="stockQuote.validateSymbol( true );"</span>
				<span style="COLOR: #ff0000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        invalid</span>
				<span style="COLOR: #0000ff">="stockQuote.validateSymbol( false );"</span>
				<span style="COLOR: #0000ff">/&gt;</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span>
				<span style="COLOR: #0000ff">&lt;</span>
				<span style="COLOR: #800000">mx:Form</span>
				<span style="COLOR: #0000ff">&gt;</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span>
				<span style="COLOR: #0000ff">&lt;</span>
				<span style="COLOR: #800000">mx:FormItem </span>
				<span style="COLOR: #ff0000">label</span>
				<span style="COLOR: #0000ff">="Symbol"</span>
				<span style="COLOR: #0000ff">&gt;</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            </span>
				<span style="COLOR: #0000ff">&lt;</span>
				<span style="COLOR: #800000">mx:TextInput <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />                </span>
				<span style="COLOR: #ff0000">id</span>
				<span style="COLOR: #0000ff">="symbolTextInput"</span>
				<span style="COLOR: #0000ff">/&gt;</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            </span>
				<span style="COLOR: #0000ff">&lt;</span>
				<span style="COLOR: #800000">mx:Button <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />                </span>
				<span style="COLOR: #ff0000">label</span>
				<span style="COLOR: #0000ff">="Get Quote"</span>
				<span style="COLOR: #ff0000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />                enabled</span>
				<span style="COLOR: #0000ff">="{ stockQuote.isValid }"</span>
				<span style="COLOR: #ff0000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />                click</span>
				<span style="COLOR: #0000ff">="getQuoteForSymbol();"</span>
				<span style="COLOR: #0000ff">/&gt;</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span>
				<span style="COLOR: #0000ff">&lt;/</span>
				<span style="COLOR: #800000">mx:FormItem</span>
				<span style="COLOR: #0000ff">&gt;</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />                <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span>
				<span style="COLOR: #0000ff">&lt;</span>
				<span style="COLOR: #800000">mx:FormItem </span>
				<span style="COLOR: #ff0000">label</span>
				<span style="COLOR: #0000ff">="Price Quote"</span>
				<span style="COLOR: #0000ff">&gt;</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            </span>
				<span style="COLOR: #0000ff">&lt;</span>
				<span style="COLOR: #800000">mx:Label </span>
				<span style="COLOR: #ff0000">text</span>
				<span style="COLOR: #0000ff">="{ standardEuroFormatter.format( stockQuote.lastStockQuote ) }"</span>
				<span style="COLOR: #0000ff">/&gt;</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />            </span>
				<span style="COLOR: #0000ff">&lt;</span>
				<span style="COLOR: #800000">mx:Label </span>
				<span style="COLOR: #ff0000">text</span>
				<span style="COLOR: #0000ff">="{ stockQuote.statusMessage }"</span>
				<span style="COLOR: #0000ff">/&gt;</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span>
				<span style="COLOR: #0000ff">&lt;/</span>
				<span style="COLOR: #800000">mx:FormItem</span>
				<span style="COLOR: #0000ff">&gt;</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span>
				<span style="COLOR: #0000ff">&lt;/</span>
				<span style="COLOR: #800000">mx:Form</span>
				<span style="COLOR: #0000ff">&gt;</span>
				<span style="COLOR: #000000">    <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #0000ff">&lt;/</span>
				<span style="COLOR: #800000">mx:Panel</span>
				<span style="COLOR: #0000ff">&gt;</span>
		</div>
		<p>
				<br />此视图中我们不需要使用ModelLocator，而是使用StockQuote作为参数传入StockMarketPod.mxml<br />引用视图的代码<br /></p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #0000ff">&lt;</span>
				<span style="COLOR: #800000">mx:Script</span>
				<span style="COLOR: #0000ff">&gt;</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span>
				<span style="COLOR: #0000ff">&lt;![CDATA[</span>
				<span style="COLOR: #808080">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        import com.adobe.cairngorm.samples.dashboard.model.ModelLocator;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        import com.adobe.cairngorm.samples.dashboard.model.StockQuote;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />                                    <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        [Bindable]<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        private var model : ModelLocator = ModelLocator.getInstance();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        [Bindable]<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        private var stockQuote : StockQuote = model.stockQuote;    <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span>
				<span style="COLOR: #0000ff">]]&gt;</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">&lt;/</span>
				<span style="COLOR: #800000">mx:Script</span>
				<span style="COLOR: #0000ff">&gt;</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #0000ff">&lt;</span>
				<span style="COLOR: #800000">view:StockMarketPod <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span>
				<span style="COLOR: #ff0000">stockQuote</span>
				<span style="COLOR: #0000ff">="{ stockQuote }"</span>
				<span style="COLOR: #ff0000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    title</span>
				<span style="COLOR: #0000ff">="Stockmarket Pod"</span>
				<span style="COLOR: #0000ff">/&gt;</span>
		</div>
		<p> </p>
		<p>只传递需要的信息给视图是一个比较好的做法，而尽量少使用ModelLocator这样的全局变量，这样也使用视图重用性更高。<br /></p><img src ="http://www.blogjava.net/usherlight/aggbug/90621.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/usherlight/" target="_blank">云自无心水自闲</a> 2006-12-29 00:36 <a href="http://www.blogjava.net/usherlight/archive/2006/12/29/90621.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Cairngorm示例--业务逻辑如何管理视图（II）</title><link>http://www.blogjava.net/usherlight/archive/2006/12/28/90406.html</link><dc:creator>云自无心水自闲</dc:creator><author>云自无心水自闲</author><pubDate>Wed, 27 Dec 2006 16:50:00 GMT</pubDate><guid>http://www.blogjava.net/usherlight/archive/2006/12/28/90406.html</guid><wfw:comment>http://www.blogjava.net/usherlight/comments/90406.html</wfw:comment><comments>http://www.blogjava.net/usherlight/archive/2006/12/28/90406.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/usherlight/comments/commentRss/90406.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/usherlight/services/trackbacks/90406.html</trackback:ping><description><![CDATA[<p>上次介绍了如何在业务逻辑中改变视图，这次讲解一种新方法。我们的股票市场显示图将扩展为多股票报价查询器。我们将看到业务逻辑是怎么调整每个视图的。而且我们还会接触到无状态命令是怎么使得事情变得简单。<br />第三次迭代--创建业务逻辑管理多视图<br />我们经常可以发现会有很多个类型一样的视图，其背后的功能也非常类似。每个视图显示一个Model对象。这些视图可以在开始时从管理对象处请求一个Model对象。比如：我们的StockMarketDashboard.mxml可以进行这样的添加：<br /></p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #0000ff">&lt;</span>
				<span style="COLOR: #800000">view:StockMarketPod <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span>
				<span style="COLOR: #ff0000">quoteId</span>
				<span style="COLOR: #0000ff">="quote1"</span>
				<span style="COLOR: #ff0000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    title</span>
				<span style="COLOR: #0000ff">="Stockmarket first pod"</span>
				<span style="COLOR: #0000ff">/&gt;</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">&lt;</span>
				<span style="COLOR: #800000">view:StockMarketPod <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span>
				<span style="COLOR: #ff0000">quoteId</span>
				<span style="COLOR: #0000ff">="quote2"</span>
				<span style="COLOR: #ff0000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    title</span>
				<span style="COLOR: #0000ff">="Stockmarket second pod"</span>
				<span style="COLOR: #0000ff">/&gt;</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">&lt;</span>
				<span style="COLOR: #800000">view:StockMarketPod <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span>
				<span style="COLOR: #ff0000">quoteId</span>
				<span style="COLOR: #0000ff">="quote3"</span>
				<span style="COLOR: #ff0000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    title</span>
				<span style="COLOR: #0000ff">="Stockmarket third pod"</span>
				<span style="COLOR: #0000ff">/&gt;</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">&lt;</span>
				<span style="COLOR: #800000">view:StockMarketPod <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span>
				<span style="COLOR: #ff0000">quoteId</span>
				<span style="COLOR: #0000ff">="quote4"</span>
				<span style="COLOR: #ff0000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    title</span>
				<span style="COLOR: #0000ff">="Stockmarket fourth pod"</span>
				<span style="COLOR: #0000ff">/&gt;</span>
		</div>
		<p>注意：视图需要传递一些唯一的标识，我们将这些标识添加到StockQuote类。</p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #0000ff">package</span>
				<span style="COLOR: #000000"> org.nevis.cairngorm.samples.dashboard.model<br /><img id="Codehighlighter1_52_190_Open_Image" onclick="this.style.display='none'; Codehighlighter1_52_190_Open_Text.style.display='none'; Codehighlighter1_52_190_Closed_Image.style.display='inline'; Codehighlighter1_52_190_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_52_190_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_52_190_Closed_Text.style.display='none'; Codehighlighter1_52_190_Open_Image.style.display='inline'; Codehighlighter1_52_190_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span>
				<span id="Codehighlighter1_52_190_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.blogjava.net/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_52_190_Open_Text">
						<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">public</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">class</span>
						<span style="COLOR: #000000"> StockQuote<br /><img id="Codehighlighter1_80_188_Open_Image" onclick="this.style.display='none'; Codehighlighter1_80_188_Open_Text.style.display='none'; Codehighlighter1_80_188_Closed_Image.style.display='inline'; Codehighlighter1_80_188_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_80_188_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_80_188_Closed_Text.style.display='none'; Codehighlighter1_80_188_Open_Image.style.display='inline'; Codehighlighter1_80_188_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span>
						<span id="Codehighlighter1_80_188_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.blogjava.net/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_80_188_Open_Text">
								<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        [Bindable]<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span>
								<span style="COLOR: #0000ff">public</span>
								<span style="COLOR: #000000"> var lastStockQuote : Number;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        [Bindable]<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span>
								<span style="COLOR: #0000ff">public</span>
								<span style="COLOR: #000000"> var stockQuoteError : String;        <br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span>
						</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
				</span>
		</div>
		<p>
				<br />管理对象StockQuoteManager，在ModelLocator实例中初始化。但是StockQuoteManager会是一个怎样的对象呢？<br />通常我使用Hashmap来实现，其键值就是视图中的唯一标识符。在构造函数中我们可以初始化这个Hashmap，Flex2中我们使用flash.utils.Dictionary<br /></p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000"> function StockQuoteManager() <br /><img id="Codehighlighter1_37_72_Open_Image" onclick="this.style.display='none'; Codehighlighter1_37_72_Open_Text.style.display='none'; Codehighlighter1_37_72_Closed_Image.style.display='inline'; Codehighlighter1_37_72_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_37_72_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_37_72_Closed_Text.style.display='none'; Codehighlighter1_37_72_Open_Image.style.display='inline'; Codehighlighter1_37_72_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span>
				<span id="Codehighlighter1_37_72_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.blogjava.net/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_37_72_Open_Text">
						<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    stockQuotes </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">new</span>
						<span style="COLOR: #000000"> Dictionary();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
				</span>
		</div>
		<p>
				<br />getStockQuote方法返回一个stockQuote对象<br /></p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000"> function getStockQuote( quoteId : String ) : StockQuote<br /><img id="Codehighlighter1_63_261_Open_Image" onclick="this.style.display='none'; Codehighlighter1_63_261_Open_Text.style.display='none'; Codehighlighter1_63_261_Closed_Image.style.display='inline'; Codehighlighter1_63_261_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_63_261_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_63_261_Closed_Text.style.display='none'; Codehighlighter1_63_261_Open_Image.style.display='inline'; Codehighlighter1_63_261_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span>
				<span id="Codehighlighter1_63_261_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.blogjava.net/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_63_261_Open_Text">
						<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    var key : String </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> quoteId;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">if</span>
						<span style="COLOR: #000000">( stockQuotes[ key ] </span>
						<span style="COLOR: #000000">==</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">null</span>
						<span style="COLOR: #000000"> )<br /><img id="Codehighlighter1_129_217_Open_Image" onclick="this.style.display='none'; Codehighlighter1_129_217_Open_Text.style.display='none'; Codehighlighter1_129_217_Closed_Image.style.display='inline'; Codehighlighter1_129_217_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_129_217_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_129_217_Closed_Text.style.display='none'; Codehighlighter1_129_217_Open_Image.style.display='inline'; Codehighlighter1_129_217_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span>
						<span id="Codehighlighter1_129_217_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.blogjava.net/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_129_217_Open_Text">
								<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        var stockQuote : StockQuote </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #0000ff">new</span>
								<span style="COLOR: #000000"> StockQuote();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        stockQuotes[ key ] </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> stockQuote;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span>
						</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">return</span>
						<span style="COLOR: #000000"> StockQuote( stockQuotes[ key ] );<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
				</span>
		</div>
		<p>
				<br />StockMarketPod.mxml几乎没有什么改动。只需要将那个唯一的标识符发送给命令，因为命令需要从管理对象处取得StockQuote对象。所以GetStockQuoteEvent类多了一个quoteId属性。<br />在GetStockQuoteCommand中，需要将唯一标识符保存在一个成员变量中<br /></p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #0000ff">private</span>
				<span style="COLOR: #000000"> var model : ModelLocator </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> ModelLocator.getInstance();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #0000ff">private</span>
				<span style="COLOR: #000000"> var quoteId : String;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />         <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000"> function execute( event : CairngormEvent ) : </span>
				<span style="COLOR: #0000ff">void</span>
				<span style="COLOR: #000000">
						<br />
						<img id="Codehighlighter1_154_429_Open_Image" onclick="this.style.display='none'; Codehighlighter1_154_429_Open_Text.style.display='none'; Codehighlighter1_154_429_Closed_Image.style.display='inline'; Codehighlighter1_154_429_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
						<img id="Codehighlighter1_154_429_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_154_429_Closed_Text.style.display='none'; Codehighlighter1_154_429_Open_Image.style.display='inline'; Codehighlighter1_154_429_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />
				</span>
				<span id="Codehighlighter1_154_429_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.blogjava.net/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_154_429_Open_Text">
						<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    var stockQuoteEvent : GetStockQuoteEvent </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> GetStockQuoteEvent( event );             <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    var symbol : String </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> stockQuoteEvent.symbol;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    quoteId </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> stockQuoteEvent.quoteId;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    var delegate : StockMarketDelegate </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">new</span>
						<span style="COLOR: #000000"> StockMarketDelegate( </span>
						<span style="COLOR: #0000ff">this</span>
						<span style="COLOR: #000000"> );<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    delegate.getQuoteForSymbol( symbol );<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
				</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000"> function onResult( event : ResultEvent </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">null</span>
				<span style="COLOR: #000000"> ) : </span>
				<span style="COLOR: #0000ff">void</span>
				<span style="COLOR: #000000">
						<br />
						<img id="Codehighlighter1_496_747_Open_Image" onclick="this.style.display='none'; Codehighlighter1_496_747_Open_Text.style.display='none'; Codehighlighter1_496_747_Closed_Image.style.display='inline'; Codehighlighter1_496_747_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
						<img id="Codehighlighter1_496_747_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_496_747_Closed_Text.style.display='none'; Codehighlighter1_496_747_Open_Image.style.display='inline'; Codehighlighter1_496_747_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />
				</span>
				<span id="Codehighlighter1_496_747_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.blogjava.net/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_496_747_Open_Text">
						<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #008000">//</span>
						<span style="COLOR: #008000">simulate a result from service</span>
						<span style="COLOR: #008000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
						</span>
						<span style="COLOR: #000000">    var lastStockQuote : Number </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> Math.random() </span>
						<span style="COLOR: #000000">*</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">50</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">+</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">5</span>
						<span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    var stockQuote : StockQuote </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> model.stockQuoteManager.getStockQuote( quoteId );<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    stockQuote.lastStockQuote </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> lastStockQuote;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    stockQuote.stockQuoteError </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">""</span>
						<span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
				</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000"> function onFault( event : FaultEvent </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">null</span>
				<span style="COLOR: #000000"> ) : </span>
				<span style="COLOR: #0000ff">void</span>
				<span style="COLOR: #000000">
						<br />
						<img id="Codehighlighter1_812_980_Open_Image" onclick="this.style.display='none'; Codehighlighter1_812_980_Open_Text.style.display='none'; Codehighlighter1_812_980_Closed_Image.style.display='inline'; Codehighlighter1_812_980_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
						<img id="Codehighlighter1_812_980_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_812_980_Closed_Text.style.display='none'; Codehighlighter1_812_980_Open_Image.style.display='inline'; Codehighlighter1_812_980_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />
				</span>
				<span id="Codehighlighter1_812_980_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.blogjava.net/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_812_980_Open_Text">
						<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    var stockQuote : StockQuote </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> model.stockQuoteManager.getStockQuote( quoteId );<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    stockQuote.lastStockQuote </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> NaN;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    stockQuote.stockQuoteError </span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">An error occured.</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
				</span>
		</div>
		<p>注意一下，在上面的代码中我们使用的是无状态命令，在Cairngorm的说明中，无状态命令是每次Cairngorm事件的响应都创建一个新的命令实例的方式。因此，在这种方式中我们可以放心地把变量存储在成员变量中，而不用担心被其他人改变。<br /></p><img src ="http://www.blogjava.net/usherlight/aggbug/90406.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/usherlight/" target="_blank">云自无心水自闲</a> 2006-12-28 00:50 <a href="http://www.blogjava.net/usherlight/archive/2006/12/28/90406.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Cairngorm示例--业务逻辑如何管理视图（I）</title><link>http://www.blogjava.net/usherlight/archive/2006/12/27/90195.html</link><dc:creator>云自无心水自闲</dc:creator><author>云自无心水自闲</author><pubDate>Tue, 26 Dec 2006 17:31:00 GMT</pubDate><guid>http://www.blogjava.net/usherlight/archive/2006/12/27/90195.html</guid><wfw:comment>http://www.blogjava.net/usherlight/comments/90195.html</wfw:comment><comments>http://www.blogjava.net/usherlight/archive/2006/12/27/90195.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/usherlight/comments/commentRss/90195.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/usherlight/services/trackbacks/90195.html</trackback:ping><description><![CDATA[<p>当服务端或者客户端的逻辑变化后，有很多种方法来更新视图。我比较推荐使用ModelLocator策略，主要是使用Flex的绑定功能。<br />通常你的视图与ModelLocator的属性绑定，这些属性可以由命令或者其他的业务逻辑或者其他视图所改变。而一旦这些属性发生了变化，所有与它们绑定的视图都随之变化。<br />因为很多的Cairngorm的例子都想做得浅显易懂，因此经常是简单地将这些属性做为ModelLocator中的一个暴露给外界的成员变量。而当Cairngorm的应用变得庞大的时候，这往往是不够的。在此我将会专门针对这个问题展示一个例子。这个例子是一个股票市场的显示表。<br /><strong>第一次迭代：将应用运转起来<br /></strong>首先看一下Cairngorm所主张的MVC模式。目前股票市场显示表将只包含一些简单的UI控制。点击“GetQuote”来派发Cairngorm事件，调用命令来请求一个新报价。StockMarketPod.mxml中在Button的Click事件中派发Cairngorm事件。<br /></p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #0000ff">&lt;</span>
				<span style="COLOR: #800000">mx:Button </span>
				<span style="COLOR: #ff0000">label</span>
				<span style="COLOR: #0000ff">="Get Quote"</span>
				<span style="COLOR: #ff0000"> click</span>
				<span style="COLOR: #0000ff">="getQuoteForSymbol();"</span>
				<span style="COLOR: #0000ff">/&gt;</span>
		</div>
		<p>相应的脚本代码：<br /></p>
		<p>
		</p>
		<span id="Codehighlighter1_89_235_Open_Text">
				<p>
				</p>
		</span>  
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> org.nevis.cairngorm.samples.dashboard.events.GetStockQuoteEvent;                                    <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> function getQuoteForSymbol() : </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"><br /><img id="Codehighlighter1_125_234_Open_Image" onclick="this.style.display='none'; Codehighlighter1_125_234_Open_Text.style.display='none'; Codehighlighter1_125_234_Closed_Image.style.display='inline'; Codehighlighter1_125_234_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_125_234_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_125_234_Closed_Text.style.display='none'; Codehighlighter1_125_234_Open_Image.style.display='inline'; Codehighlighter1_125_234_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_125_234_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_125_234_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    var event : GetStockQuoteEvent </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> GetStockQuoteEvent( symbolTextInput.text );<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    dispatchEvent( event );<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div><p>GetStockQuoteCommand响应并处理这个Cairngorm事件，请求一个业务代理类来报价。<br /></p><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> function execute( event : CairngormEvent ) : </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"><br /><img id="Codehighlighter1_57_228_Open_Image" onclick="this.style.display='none'; Codehighlighter1_57_228_Open_Text.style.display='none'; Codehighlighter1_57_228_Closed_Image.style.display='inline'; Codehighlighter1_57_228_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_57_228_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_57_228_Closed_Text.style.display='none'; Codehighlighter1_57_228_Open_Image.style.display='inline'; Codehighlighter1_57_228_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_57_228_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_57_228_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    var symbol : String </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> GetStockQuoteEvent( event ).symbol;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    var delegate : StockMarketDelegate </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> StockMarketDelegate( </span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000"> );<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    delegate.getQuoteForSymbol( symbol );<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div><p><br />在实际情况中，需要进行一个远程的服务器端的调用，在Demo中，为简化起见，我注释掉了远程调用的相关代码。这里StockMarketDelegate.as只是对命令进行回调。<br /></p><p></p><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> function StockMarketDelegate( responder : Responder )<br /><img id="Codehighlighter1_61_197_Open_Image" onclick="this.style.display='none'; Codehighlighter1_61_197_Open_Text.style.display='none'; Codehighlighter1_61_197_Closed_Image.style.display='inline'; Codehighlighter1_61_197_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_61_197_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_61_197_Closed_Text.style.display='none'; Codehighlighter1_61_197_Open_Image.style.display='inline'; Codehighlighter1_61_197_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_61_197_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_61_197_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">disabled for demo<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">this.service = ServiceLocator.getInstance().getService( "stockMarketDelegate" );</span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.responder </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> responder;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> function getQuoteForSymbol( symbol : String ) : </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"><br /><img id="Codehighlighter1_262_524_Open_Image" onclick="this.style.display='none'; Codehighlighter1_262_524_Open_Text.style.display='none'; Codehighlighter1_262_524_Closed_Image.style.display='inline'; Codehighlighter1_262_524_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_262_524_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_262_524_Closed_Text.style.display='none'; Codehighlighter1_262_524_Open_Image.style.display='inline'; Codehighlighter1_262_524_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_262_524_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_262_524_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">disabled for demo<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">var call : AsyncToken = service.getQuoteForSymbol( symbol );<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">call.resultHandler = responder.onResult;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">call.faultHandler = responder.onFault;</span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">( symbol </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">fail</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> )<br /><img id="Codehighlighter1_460_486_Open_Image" onclick="this.style.display='none'; Codehighlighter1_460_486_Open_Text.style.display='none'; Codehighlighter1_460_486_Closed_Image.style.display='inline'; Codehighlighter1_460_486_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_460_486_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_460_486_Closed_Text.style.display='none'; Codehighlighter1_460_486_Open_Image.style.display='inline'; Codehighlighter1_460_486_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span id="Codehighlighter1_460_486_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_460_486_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        responder.onFault();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br /><img id="Codehighlighter1_495_522_Open_Image" onclick="this.style.display='none'; Codehighlighter1_495_522_Open_Text.style.display='none'; Codehighlighter1_495_522_Closed_Image.style.display='inline'; Codehighlighter1_495_522_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_495_522_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_495_522_Closed_Text.style.display='none'; Codehighlighter1_495_522_Open_Image.style.display='inline'; Codehighlighter1_495_522_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span id="Codehighlighter1_495_522_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_495_522_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        responder.onResult();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div><p>我们的StockMarketPod视图只需要两条消息，<br />1. 股票的报价<br />2. 错误消息<br />因为现在是第一次迭代过程中，处理比较简单，因此使用ModelLocator的成员来解决。<br /></p><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> var lastStockQuote : Number;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> var stockQuoteError : String;</span></div><p><br />在此Demo中，GetStockQuoteCommand命令模拟返回相应的结果。<br /></p><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> function onResult( event : ResultEvent </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000"> ) : </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"><br /><img id="Codehighlighter1_62_215_Open_Image" onclick="this.style.display='none'; Codehighlighter1_62_215_Open_Text.style.display='none'; Codehighlighter1_62_215_Closed_Image.style.display='inline'; Codehighlighter1_62_215_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_62_215_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_62_215_Closed_Text.style.display='none'; Codehighlighter1_62_215_Open_Image.style.display='inline'; Codehighlighter1_62_215_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_62_215_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_62_215_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">simulate a result from service</span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">    var stockQuote : Number </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> Math.random() </span><span style="COLOR: #000000">*</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">50</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">5</span><span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    model.lastStockQuote </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> stockQuote;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    model.stockQuoteError </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">""</span><span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" /> }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> function onFault( event : FaultEvent </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000"> ) : </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"><br /><img id="Codehighlighter1_280_357_Open_Image" onclick="this.style.display='none'; Codehighlighter1_280_357_Open_Text.style.display='none'; Codehighlighter1_280_357_Closed_Image.style.display='inline'; Codehighlighter1_280_357_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_280_357_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_280_357_Closed_Text.style.display='none'; Codehighlighter1_280_357_Open_Image.style.display='inline'; Codehighlighter1_280_357_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_280_357_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_280_357_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    model.lastStockQuote </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> NaN;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    model.stockQuoteError </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">An error occured.</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div><p>StockMarketPod视图绑定这些成员并进行一些格式化的处理。<br /></p><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">mx:FormItem </span><span style="COLOR: #ff0000">label</span><span style="COLOR: #0000ff">="Symbol"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">mx:Label </span><span style="COLOR: #ff0000">text</span><span style="COLOR: #0000ff">="{ formatQuote( model.lastStockQuote ) }"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">mx:FormItem</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">mx:FormItem</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">mx:Label </span><span style="COLOR: #ff0000">text</span><span style="COLOR: #0000ff">="{ model.stockQuoteError }"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">mx:FormItem</span><span style="COLOR: #0000ff">&gt;</span></div><p>格式化函数的脚本<br /></p><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> function formatQuote( quote : Number ) : String<br /><img id="Codehighlighter1_56_109_Open_Image" onclick="this.style.display='none'; Codehighlighter1_56_109_Open_Text.style.display='none'; Codehighlighter1_56_109_Closed_Image.style.display='inline'; Codehighlighter1_56_109_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_56_109_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_56_109_Closed_Text.style.display='none'; Codehighlighter1_56_109_Open_Image.style.display='inline'; Codehighlighter1_56_109_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_56_109_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_56_109_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> ( isNaN( quote ) ) </span><span style="COLOR: #000000">?</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">""</span><span style="COLOR: #000000"> : String( quote );<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div><p><br />现在我们来进行重构并将一些功能从视图中抽取出来到一个可以进行单元测试的工具类中。</p><p><strong>第二次迭代，创建符合需求的业务逻辑</strong><br />现在我们已经有一个可以运行的最简单的应用。当你的应用变得庞大后，将会有很多的限制。你会发现你的ModelLocator非常的臃肿，以致于有时候，你都找不到你所要的成员。甚至会有命名冲突的事情发生。<br />一个普通的重构方法是封装你的用例图中的成员成为一个业务对象。这个业务对象能够表达业务上下文中需要的视图信息。你可以把业务对象设计得最适合用例图的粒度。在一个大型的应用中，你可能会设计一系列的业务对象来表达你的用例。你的视图将会绑定这些对象或者这些对象的属性上。通过这种方法，ModelLocator与其目标之间的联系更容易，开发者更容易掌握业务逻辑所包含的内容。<br />在这个Demo中，我们可以把astStockQuote和stockQuoteError这两个成员封装到一个业务对象中。<br /></p><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">package</span><span style="COLOR: #000000"> org.nevis.cairngorm.samples.dashboard.model<br /><img id="Codehighlighter1_52_188_Open_Image" onclick="this.style.display='none'; Codehighlighter1_52_188_Open_Text.style.display='none'; Codehighlighter1_52_188_Closed_Image.style.display='inline'; Codehighlighter1_52_188_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_52_188_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_52_188_Closed_Text.style.display='none'; Codehighlighter1_52_188_Open_Image.style.display='inline'; Codehighlighter1_52_188_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_52_188_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_52_188_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> StockQuote<br /><img id="Codehighlighter1_80_186_Open_Image" onclick="this.style.display='none'; Codehighlighter1_80_186_Open_Text.style.display='none'; Codehighlighter1_80_186_Closed_Image.style.display='inline'; Codehighlighter1_80_186_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_80_186_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_80_186_Closed_Text.style.display='none'; Codehighlighter1_80_186_Open_Image.style.display='inline'; Codehighlighter1_80_186_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span id="Codehighlighter1_80_186_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_80_186_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        [Bindable]<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> var lastStockQuote : Number;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        [Bindable]<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> var stockQuoteError : String;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div><p><br />这样在ModelLocator中，我们只需要定义一个成员<br />public var stockQuote : StockQuote = new StockQuote ();<br />我们的视图也相应修改为：<br /></p><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">mx:FormItem </span><span style="COLOR: #ff0000">label</span><span style="COLOR: #0000ff">="Symbol"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">mx:Label </span><span style="COLOR: #ff0000">text</span><span style="COLOR: #0000ff">="{ formatQuote( model.stockQuote.lastStockQuote ) }"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">mx:FormItem</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">mx:FormItem</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">mx:Label </span><span style="COLOR: #ff0000">text</span><span style="COLOR: #0000ff">="{ model.stockQuote.stockQuoteError }"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">mx:FormItem</span><span style="COLOR: #0000ff">&gt;</span></div><span id="Codehighlighter1_89_235_Open_Text"></span><img src ="http://www.blogjava.net/usherlight/aggbug/90195.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/usherlight/" target="_blank">云自无心水自闲</a> 2006-12-27 01:31 <a href="http://www.blogjava.net/usherlight/archive/2006/12/27/90195.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>为什么你不应该使用Cairngorm(Steven Webster,Cairngorm的主创人员)</title><link>http://www.blogjava.net/usherlight/archive/2006/09/12/69141.html</link><dc:creator>云自无心水自闲</dc:creator><author>云自无心水自闲</author><pubDate>Tue, 12 Sep 2006 05:41:00 GMT</pubDate><guid>http://www.blogjava.net/usherlight/archive/2006/09/12/69141.html</guid><wfw:comment>http://www.blogjava.net/usherlight/comments/69141.html</wfw:comment><comments>http://www.blogjava.net/usherlight/archive/2006/09/12/69141.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/usherlight/comments/commentRss/69141.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/usherlight/services/trackbacks/69141.html</trackback:ping><description><![CDATA[1. 我从未创建过一个不使用Cairngorm的RIA应用, 甚至是连一个Mini项目我也使用了Cairngorm.<br />使用Cairngorm放大或者说是加剧了学习曲线, 大多数第一次使用Flex的开发者是从创建小的应用开始逐步了解Flex的思想和概念. 所以最好先从使用容器和组件,创建动态界面,使用WebService/HTTP Service,绑定其返回结果这样的步骤开始.<br />然后尝试更新后台的持久数据,使用ColdFunsion/Java/C#/PHP等等.这是Flex开发者学习道路上的一个里程碑.<br />接下来,可以去理解风格/状态/效果这样的Flex功能, 在Mxml中写一些ActionScript.<br />以上的这些步骤都不涉及到Cairngorm,直到你能熟练地使用Flex后, 可以去阅读Cairngorm的系列文章(http://www.adobe.com/devnet/flex/articles/cairngorm_pt1.html)<br />2. 你的应用与用户的交互非常少,只有一两个<br />这主要是用于衡量应用的复杂性,如果你的应用中的用户用例(Use-Case)比较多,那么Cairngorm对你将会非常有价值.<br />相反,如果用例比较少,那么你完全可以不使用Cairngorm来完成应用.<br />最好的解决方案不是无物可加,而是无物可舍!<br />the best solution is not when there is nothing left to add, but when there is nothing left to take away!<br />3. 你是应用的唯一开发者<br />Cairngorm的优点是可控性/可维护性/伸缩性, 在别人的工作基础添加功能变得非常非常容易.<br />而如果只有你一个开发者,那么不使用Cairngorm将会一种简洁的做法.<br />4. 你发现了Cairngorm的Bug<br />如果你发现了Bug,那么就不适合在重要的项目中使用Cairngorm.<br />Cairngorm并不是完全没有Bug,在早期的Beta版中,和其他软件产品一样,我们忽略了一些偶尔出现的Bug.<br /><br /><img src ="http://www.blogjava.net/usherlight/aggbug/69141.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/usherlight/" target="_blank">云自无心水自闲</a> 2006-09-12 13:41 <a href="http://www.blogjava.net/usherlight/archive/2006/09/12/69141.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Cairngorm的概要介绍、简介</title><link>http://www.blogjava.net/usherlight/archive/2006/08/31/66777.html</link><dc:creator>云自无心水自闲</dc:creator><author>云自无心水自闲</author><pubDate>Thu, 31 Aug 2006 01:36:00 GMT</pubDate><guid>http://www.blogjava.net/usherlight/archive/2006/08/31/66777.html</guid><wfw:comment>http://www.blogjava.net/usherlight/comments/66777.html</wfw:comment><comments>http://www.blogjava.net/usherlight/archive/2006/08/31/66777.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/usherlight/comments/commentRss/66777.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/usherlight/services/trackbacks/66777.html</trackback:ping><description><![CDATA[Cairngorm的组成：<br />1. Model Locator：保存应用的ValueObject（数据）和共享变量，与HttpSession类似，只不过是保存在客户端而不是在服务器端而已<br />2. View：一个或者多个Flex组件（按钮、Panel、下拉框等等）组合在成一个被命名的单元。绑定Model Locator中的数据，根据用户动作（点击、滚动、拖放）产生自定义的Cairngorm事件。<br />3. Front Controller：接收Cairngorm事件，并映射到对应的Cairngorm命令。<br />4. Command：处理业务逻辑，调用Cairngorm的代理或者其他命令，更新Model Locator中的Value Object和变量值。<br />5. Delegate：在命令中创建，初始化一个远程调用（Http, WebService等等），并将返回结果传递给Command。<br />6. Service：定义远程调用连接远程的数据存储。<br />Cairngorm的工作方式：<br />1. 客户端界面由各个View组成，View通过绑定Model Locator的成员来显示数据。View根据用户操作生成事件。这些事件由Front Controller广播并接收，然后映射到相应的命令。命令包含业务逻辑、创建代理来完成操作，处理代理返回的结果，并更新Model Locator的数据。因为View是与Model Locator中的数据绑定的，因此Model Locator中数据更新后，View自动反应出数据的变化。由代理调用服务并返回处理结果不是必须的，但是这是推荐做法。<img src ="http://www.blogjava.net/usherlight/aggbug/66777.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/usherlight/" target="_blank">云自无心水自闲</a> 2006-08-31 09:36 <a href="http://www.blogjava.net/usherlight/archive/2006/08/31/66777.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Iteration::two的基于Flex的开源项目-- Cairngorm store的学习笔记(小结)</title><link>http://www.blogjava.net/usherlight/archive/2006/04/05/39367.html</link><dc:creator>云自无心水自闲</dc:creator><author>云自无心水自闲</author><pubDate>Wed, 05 Apr 2006 05:51:00 GMT</pubDate><guid>http://www.blogjava.net/usherlight/archive/2006/04/05/39367.html</guid><wfw:comment>http://www.blogjava.net/usherlight/comments/39367.html</wfw:comment><comments>http://www.blogjava.net/usherlight/archive/2006/04/05/39367.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/usherlight/comments/commentRss/39367.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/usherlight/services/trackbacks/39367.html</trackback:ping><description><![CDATA[这一段时间在 Cairngorm上搭建了一个小项目, 顺便小结一下开发过程:<br />1. 首先规划构建View, 将一个应用的界面, 分成适当的Mxml Component<br />2. view中必然涉及的需要数据的绑定, 将组件需要的数据都集中到ModelLocator中.<br />3. 设计事件(CairngormEvent), 也就是与用户交互的过程中以及系统运转的过程中会需要派发哪些事件, <br />需要注意的一点是, Cairngorm中Flex事件也需要转化成CairngormEvent<br />4. 设计事件的处理函数, 也就是命令. 在FrontControl中对事件和命令进行注册.<br />5. 命令中通过代理去调用服务.<br />5. 设计代理类, 在代理类中调用服务<br />5. 设计命令中涉及的服务(最可能的是与数据库的交互), 并添加相应的配置<br />6. 设计服务中需要使用的ValueObject<br />7. 命令中如果需要对视图组件数据进行存取, 需要通过ViewHelper来完成, 设计相应的ViewHelper. <br />同时在mxml中对viewHelper进行注册.<br /><br />补充说明: 事件的产生不一定全部是与用户交互的结果, 也就是说不全是由View产生的. <br />当然大部分的事件(比如用户点击了保存按钮)是这样产生的.<br />在命令中也可以产生命令, 典型的就是SequenceCommand, 应用中可以把一个事件的处理分成几个步骤来完成,<br />完成第1个步骤后怎么通知第2个步骤开始呢, 当然还是继续派发事件啦. 在SequenceCommand在类中,<br />把派发事件封装了一下, 给出了一个executeNextCommand()可以直接调用. <br />不过在这里我也遇到了一个问题, 直接使用SequenceCommand的executeNextCommand()并不管用.<br />好象dispatchEvent并没有效果, 我后来是自己修改了代码, 使用Application.application.dispatchEvent才解决问题的.<br /><br />Cairngorm的优点:<br />一. 实现了比较彻底的解耦<br />1. 事件机制, 对用户的响应(比如点击保存按钮), 并不是直接从View中抓取数据, 然后New一个类, 调用这个类的某个方法,<br />将数据保存到数据库中, 而只是简单地派发一个事件, 具体事件由谁来响应, 如何处理对他来说是透明不可见的.<br />2. Locator模式, Cairngorm中service, view, model的获取都是通过Locator的, <br />也就是说系统其他部分对于service, view, model只需要知道其ID就够了, 其内部实现等待细节都是不需要知道的.<br />举个例子, 传统的方法: 你要找一个叫张三的人帮你干一件事, 你需要知道张三长什么样, <br />然后在一个坐着10个人的大办公室里找到他, 告诉他你的要求.<br />而现在在这个大办公室的门口多了一个前台小姐, 你只需要告诉这个小姐,我要找张三, 然后她会帮你去找, <br />你根本不需要知道张三的模样.<br /><br />RIA的优点: 由于Flex的原因, 系统处理是异步的. <br />比如, 你请求了一个比较耗时的数据库读取操作, 请求发出后, 你就可以进行其他操作了, 服务结束会产生相应事件, <br />然后由Command进行后续处理, 最后引发页面数据更新.<br /><br /><img src ="http://www.blogjava.net/usherlight/aggbug/39367.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/usherlight/" target="_blank">云自无心水自闲</a> 2006-04-05 13:51 <a href="http://www.blogjava.net/usherlight/archive/2006/04/05/39367.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Iteration::two的基于Flex的开源项目-- Cairngorm store的学习笔记(三)</title><link>http://www.blogjava.net/usherlight/archive/2006/03/14/35287.html</link><dc:creator>云自无心水自闲</dc:creator><author>云自无心水自闲</author><pubDate>Tue, 14 Mar 2006 12:26:00 GMT</pubDate><guid>http://www.blogjava.net/usherlight/archive/2006/03/14/35287.html</guid><wfw:comment>http://www.blogjava.net/usherlight/comments/35287.html</wfw:comment><comments>http://www.blogjava.net/usherlight/archive/2006/03/14/35287.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/usherlight/comments/commentRss/35287.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/usherlight/services/trackbacks/35287.html</trackback:ping><description><![CDATA[<font face="Courier New">先简要地介绍一下Cairngorm中采用的设计模式:<br />Cairngorm框架最大的革新是将用户行为和系统级事件统一地映射为Cairngorm事件. <br />当组件接收到用户行为或者系统事件后, 用户请求被转换成组件可以传播的内部事件. RIA中处理用户请求不需要到服务器去转一圈.<br />当用户行为指定要执行一个功能时, Cairngorm要求广播一个合适的事件.<br />在设计模式中命令模式特别适合此种情形. 在这个模式中, 将实现功能的类称之为命令(Command). <br />每一个而且是所有的命令提供一个单点入口, 一个execute()方法. <br />这样允许第3方调用此命令, 而不需要了解命令具体是如何实现的. <br />通常这些命令被叫作"Worker", 因为他们承担了在应用背后进行工作的任务.<br /><br />我们现在开始根据示例来研究Cairngorm Store.<br />看一下Cairngorm Store关键功能之一: 将商品添加到购物车中. <br />为实现此功能, 创建一个新的命令类: AddProductToShoppingCartCommand
<div style="BORDER-RIGHT: rgb(204,204,204) 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: rgb(204,204,204) 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: rgb(204,204,204) 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(204,204,204) 1px solid; BACKGROUND-COLOR: rgb(238,238,238)"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: rgb(0,0,0)">import org.nevis.cairngorm.commands.Command;<br />import org.nevis.cairngorm.control.Event;<br />import org.nevis.cairngorm.samples.store.model.ModelLocator;<br />import org.nevis.cairngorm.samples.store.vo.ProductVO;<br /><br />class org.nevis.cairngorm.samples.store.command.AddProductToShoppingCartCommand  implements Command  <br />{<br />    public </span><span style="COLOR: rgb(0,0,255)">function</span><span style="COLOR: rgb(0,0,0)"> execute( event : Event ):Void<br />    {<br />        </span><span style="COLOR: rgb(0,0,255)">var</span><span style="COLOR: rgb(0,0,0)"> product : ProductVO </span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)"> ProductVO( event.data.product );<br />        </span><span style="COLOR: rgb(0,0,255)">var</span><span style="COLOR: rgb(0,0,0)"> quantity : Number </span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)"> Number( event.data.quantity );<br />        ModelLocator.shoppingCart.addElement( product, quantity );<br />    }    <br />}<br /></span></div></font>这个类看起来并不复杂. 首先一个具体的类实现了Cairngorm的命令接口. <br />如果你查看了Cairngorm的源码, 你会发现这个接口只是简单地规定了命令必须实现一个方法: execute() 作为入口.<br /><br />看一下execute()方法的实现, 可以发现事件是如何执行包含ProductVO值对象和数量的命令的. <br />VO和数量是预先装载在Event类中的. Event也是一个Caringorm定义的类, 其中包括事件的类型和事件的方法.<br />购物车属于客户端数据, 因此它存放于ModelLocator类中. 所以,命令只是添加适当数量的商品到购物车中, 使用购物车提供的方法.<br />这就是创建一个简单功能命令类的所有工作. 命令查询事件, 获取事件相关数据. <br />如果执行的命令更改应用的数据,比如要求在购物车视图中新增一个商品, 应用需要使用ModelLocater完成更改客户端数据.<br /><font face="Courier New"><br /></font>有一个非常重要的设计概念在这里强调一下. 在前面的示例中, <br />所有复杂的业务逻辑(比如一个购物车可以做什么,不可以做什么)都被封装在一个类中(称之为ShoppingCart). <br />比如: 一个用户添加一个商品到购物车中, 如果购物车没有此种商品, 则新增一个, 如果已经存在, 则将数量加1.<br /><br />Cairngorm并不减轻开发者创建业务对象的工作. 特别之处只是在于它实现业务域的类.<br /><br />开发者应该从Cairngorm架构中抽离出来, 把业务逻辑从命令中提取出来放入类中. <br />一个典型的实现方法是进行抽象类的重构. 此项技术的好处在于可以进行单元测试, 书写API文档, 使用其他应用开发者可以进行复用.<br />Caringorm商店中的购物车类是遵循此原则的极好的例子. <br /><br /><br /><br />借鉴设计模式的思想, Cairngorm对客户事件的进行响应而不是对服务器HTTP的进行响应, <br />Cairngorm使用前台控制(Front Controller)模式作为所有Cairngorm事件的统一入口.
<div style="BORDER-RIGHT: rgb(204,204,204) 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: rgb(204,204,204) 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: rgb(204,204,204) 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(204,204,204) 1px solid; BACKGROUND-COLOR: rgb(238,238,238)"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: rgb(0,0,0)">class org.nevis.cairngorm.samples.store.control.ShopController extends FrontController<br />{<br />    public </span><span style="COLOR: rgb(0,0,255)">function</span><span style="COLOR: rgb(0,0,0)"> ShopController()<br />   {<br />       initialiseCommands();<br />   }<br />    <br />    </span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">----------------------------------------------------------------------------</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,0,0)"><br />    public </span><span style="COLOR: rgb(0,0,255)">function</span><span style="COLOR: rgb(0,0,0)"> initialiseCommands()<br />    {<br />      addCommand( ShopController.EVENT_GET_PRODUCTS, </span><span style="COLOR: rgb(0,0,255)">new</span><span style="COLOR: rgb(0,0,0)"> GetProductsCommand() );<br />      addCommand( ShopController.EVENT_ADD_PRODUCT_TO_SHOPPING_CART, </span><span style="COLOR: rgb(0,0,255)">new</span><span style="COLOR: rgb(0,0,0)"> AddProductToShoppingCartCommand() );<br />      addCommand( ShopController.EVENT_DELETE_PRODUCT_FROM_SHOPPING_CART, </span><span style="COLOR: rgb(0,0,255)">new</span><span style="COLOR: rgb(0,0,0)"> DeleteProductFromShoppingCartCommand() );  <br />      addCommand( ShopController.EVENT_FILTER_PRODUCTS, </span><span style="COLOR: rgb(0,0,255)">new</span><span style="COLOR: rgb(0,0,0)"> FilterProductsCommand() );     <br />      addCommand( ShopController.EVENT_SORT_PRODUCTS, </span><span style="COLOR: rgb(0,0,255)">new</span><span style="COLOR: rgb(0,0,0)"> SortProductsCommand() );     <br />      addCommand( ShopController.EVENT_VALIDATE_ORDER, </span><span style="COLOR: rgb(0,0,255)">new</span><span style="COLOR: rgb(0,0,0)"> ValidateOrderCommand() );<br />      addCommand( ShopController.EVENT_VALIDATE_CREDIT_CARD, </span><span style="COLOR: rgb(0,0,255)">new</span><span style="COLOR: rgb(0,0,0)"> ValidateCreditCardCommand() );     <br />      addCommand( ShopController.EVENT_COMPLETE_PURCHASE, </span><span style="COLOR: rgb(0,0,255)">new</span><span style="COLOR: rgb(0,0,0)"> CompletePurchaseCommand() );     <br />    }<br />    <br />    </span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">-------------------------------------------------------------------------</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,0,0)"><br />    public static </span><span style="COLOR: rgb(0,0,255)">var</span><span style="COLOR: rgb(0,0,0)"> EVENT_GET_PRODUCTS </span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">getProducts</span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">;<br />    public static </span><span style="COLOR: rgb(0,0,255)">var</span><span style="COLOR: rgb(0,0,0)"> EVENT_ADD_PRODUCT_TO_SHOPPING_CART </span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">addProductToShoppingCart</span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">;<br />    public static </span><span style="COLOR: rgb(0,0,255)">var</span><span style="COLOR: rgb(0,0,0)"> EVENT_DELETE_PRODUCT_FROM_SHOPPING_CART </span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">deleteProductFromShoppingCart</span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">;  <br />    public static </span><span style="COLOR: rgb(0,0,255)">var</span><span style="COLOR: rgb(0,0,0)"> EVENT_FILTER_PRODUCTS </span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">filterProducts</span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">;<br />    public static </span><span style="COLOR: rgb(0,0,255)">var</span><span style="COLOR: rgb(0,0,0)"> EVENT_SORT_PRODUCTS </span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">sortProducts</span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">;<br />    public static </span><span style="COLOR: rgb(0,0,255)">var</span><span style="COLOR: rgb(0,0,0)"> EVENT_VALIDATE_ORDER </span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">validateOrder</span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">;<br />    public static </span><span style="COLOR: rgb(0,0,255)">var</span><span style="COLOR: rgb(0,0,0)"> EVENT_VALIDATE_CREDIT_CARD </span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">validateCreditCard</span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">;<br />    public static </span><span style="COLOR: rgb(0,0,255)">var</span><span style="COLOR: rgb(0,0,0)"> EVENT_COMPLETE_PURCHASE </span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">completePurchase</span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">;            <br />        <br />}<br /><br /></span></div>构造函数调用<span style="COLOR: rgb(0,0,0)">initialiseCommands(), 将广播的事件委派给相应的命令去处理.<br /></span><p>我们看一个添加商品到购物车的例子. 当应用广播<font face="新宋体">ShopController.EVENT_ADD_PRODUCT_TO_SHOPPING_CART命令时,<br />前台控制中下面这行代码保证AddProductToShoppingCartCommand的execute()方法被调用.</font><br />addCommand( ShopController.EVENT_ADD_PRODUCT_TO_SHOPPING_CART, new AddProductToShoppingCartCommand() );</p><p>ShopController继承了Cairngorm中的FrontController基类, 因此可以使用addCommand()来给事件注册相应的命令.<br />Cairngorm底层架构完成了剩余部分的工作. 应用中任意地方简单地广播适当的事件, Cairngorm确保相应的命令被触发.</p><p>另外需要做的是在Mxml的主入口点创建控制器. 在Cairngorm商店中, 是Main.mxml, 代码如下:<br />&lt;control:ShopController id="controller" /&gt;</p>"Control"的命名空间在应用标签中定义, 指定如下Cairngorm包:<br />xmlns:control="org.nevis.cairngorm.samples.store.control.*" <br /><br />你只需要这样做,就可以保证应用拥有一个前台控制模式, 响应所有的事件, 并触发你使用addCommand()注册的命令.<br /><p><br /></p><p><br /></p><br /><img src ="http://www.blogjava.net/usherlight/aggbug/35287.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/usherlight/" target="_blank">云自无心水自闲</a> 2006-03-14 20:26 <a href="http://www.blogjava.net/usherlight/archive/2006/03/14/35287.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Iteration::two的基于Flex的开源项目-- Cairngorm store的学习笔记(二)</title><link>http://www.blogjava.net/usherlight/archive/2006/03/09/34513.html</link><dc:creator>云自无心水自闲</dc:creator><author>云自无心水自闲</author><pubDate>Thu, 09 Mar 2006 09:28:00 GMT</pubDate><guid>http://www.blogjava.net/usherlight/archive/2006/03/09/34513.html</guid><wfw:comment>http://www.blogjava.net/usherlight/comments/34513.html</wfw:comment><comments>http://www.blogjava.net/usherlight/archive/2006/03/09/34513.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/usherlight/comments/commentRss/34513.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/usherlight/services/trackbacks/34513.html</trackback:ping><description><![CDATA[<FONT face="Courier New">在笔记一中，忘记介绍一下Iteration::two和Cairngorm的背景了。<BR>Iteration::two是一家致力于RIA开发的公司。 详情请看：<A href="http://www.iterationtwo.com/index.html">http://www.iterationtwo.com/index.html</A><BR>
<P class=body><STRONG><SPAN class=subhead>Macromedia Acquires iteration::two in creation of Macromedia Consulting Europe. </SPAN></STRONG></P>
<P class=bodybold>Macromedia acquires iteration::two, an industry-leading software consultancy,&nbsp; to create a European Rich Internet Application consulting organisation based in Edinburgh , Scotland. <BR>Cairngorm是Iteration::two的开源项目之一。下载和更新地址是<A href="http://www.iterationtwo.com/open_source_cairngorm.html">http://www.iterationtwo.com/open_source_cairngorm.html</A><BR><BR><BR>好，现在继续开始我的学习笔记：<BR>1. 在Control中有Command.as定义了Command接口，笔记一中FrontController中addCommand的调用添加的Command都必须实现此接口。Command接口只定义一个唯一的需要实现的方法execute(); 这是一个典型的命令模式, 所有后续的命令都实现此接口, 对外统一提供一个单点入口execute(), 其他的人都可以进行调用,但不需要了解命令具体的实现方式.<BR><BR>2. 在Model中定义了ModelLocator接口，ModalLocator是所有数据绑定的接口，也就是说应用中所有需要进行绑定的数据都需要通过此接口进行定位。在实际的应用中需要实现此接口，并提供所有的绑定数据。<BR><BR>3. 在business中定义了两个类 ServiceLocator和Responder。<BR>ServiceLocator这是伪单例类, 应用开发者用于定义并获得服务.<BR>之所以是伪单例类, 是因为ServiceLocator是定义在mxml中的, <BR>它需要一个无参数的Public构造函数. 使用中必须定义一个ServiceLocator的子类, 并在其中定义需要的服务.<BR><BR>代码示例:首先在Services.mxml中进行如下定义:</P>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">cairngorm:ServiceLocator&nbsp;xmlns:mx</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">http://www.macromedia.com/2003/mxml</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmlns:cairngorm</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">org.nevis.cairngorm.business.*</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">mx:RemoteObject&nbsp;id</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">customerDelegate</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&nbsp;source</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">org.nevis.cairngorm.samples.login.CustomerDelegate</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">event.call.resultHandler(&nbsp;event&nbsp;)</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fault</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">event.call.faultHandler(&nbsp;event&nbsp;)</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">&lt;/</SPAN><SPAN style="COLOR: #000000">mx:RemoteObject</SPAN><SPAN style="COLOR: #000000">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>&nbsp;</SPAN><SPAN style="COLOR: #000000">*</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">&lt;/</SPAN><SPAN style="COLOR: #000000">cairngorm:ServiceLocator</SPAN><SPAN style="COLOR: #000000">&gt;</SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top></SPAN></DIV>
<P class=bodybold>在Flex主应用中添加一行：<BR>&nbsp;&lt;business:Services id="services" /&gt;<BR>其中business命名空间在应用头部进行申明<BR>&nbsp;xmlns:business="org.nevis.cairngorm.samples.store.business.*" <BR>ServiceLocator使用方法：<BR>在业务代理类(Delegate)中通过如下方式进行调用:<BR>&nbsp;*&nbsp;&nbsp; var service = ServiceLocator.getInstance().getService( "customerDelegate" );<BR><BR><BR>在View中，定义了两个类 ViewLocator和ViewHelper<BR>ViewHelper:用于隔离Command命令类和View视图的具体实现. <BR>为了执行业务功能, Command类需要查询并更改视图, <BR>在执行业务逻辑前, 命令类需要从视图中获得用户输入的数据;<BR>业务逻辑结束后又经常需要更改视图, 显示执行结果. <BR>通过将查询和更改视图的操作封装到单独ViewHelper类中, 命令类完全不需要了解视图类的任何信息. <BR>ViewHelper属于一种特殊的视图, 当ViewHelper创建后, 就被注册到指定的视图. <BR>ViewHelper继承自MXMLObject, 在重写的初始化函数(initialized)中, 调用ViewLocator进行注册, <BR>并指定unload方法的监听函数unregister, 在unload时, 调用unregister, 使用ViewLocator的取消注册.<BR><BR>ViewLocator是一个单例类, 用于获取ViewHelper操作视图. <BR>命令类需要通过ViewHelper的方法来查询更改视图, 而ViewLocator即用于让命令类取得需要的ViewHelper.<BR>命令类不需要知道ViewHelper的名称, ViewLocator会返回需要的ViewHelper实例.<BR><BR>现在Cairngorm的基础框架已经介绍完毕，将在以后继续介绍如何在实际应用中使用上面提及的基础框架。<BR><BR><BR><BR><BR></P></FONT><img src ="http://www.blogjava.net/usherlight/aggbug/34513.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/usherlight/" target="_blank">云自无心水自闲</a> 2006-03-09 17:28 <a href="http://www.blogjava.net/usherlight/archive/2006/03/09/34513.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Iteration::two的基于Flex的开源项目-- Cairngorm store的学习笔记(一)</title><link>http://www.blogjava.net/usherlight/archive/2006/03/06/33918.html</link><dc:creator>云自无心水自闲</dc:creator><author>云自无心水自闲</author><pubDate>Mon, 06 Mar 2006 12:44:00 GMT</pubDate><guid>http://www.blogjava.net/usherlight/archive/2006/03/06/33918.html</guid><wfw:comment>http://www.blogjava.net/usherlight/comments/33918.html</wfw:comment><comments>http://www.blogjava.net/usherlight/archive/2006/03/06/33918.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/usherlight/comments/commentRss/33918.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/usherlight/services/trackbacks/33918.html</trackback:ping><description><![CDATA[<P>Cairngorm是Iteration::two的开源项目, 是使用macromedia Flex的RIA开发的最佳实践(best-practice)框架. <BR>在Cairngorm基础上开发RIA, 将会在Iteration::two的专家体系和现有的灵活可维护企业解决方案中达到平衡.<BR>Cairngorm本身并不是一个完整的企业应用, 它只是提供了一个开发的骨架, Iteration::two称之为体系.<BR>在这个体系中包括以下几个部分:<BR>1. Business(业务逻辑部分)<BR>2. Command(命令部分)<BR>3. Control(控制部分)<BR>4. Model(数据模型)<BR>5. View(界面视图)<BR>6. VO(ValueObject)</P>
<P>我们从Control说起:<BR>在Control中, 定义了3个基类: Event, EventBroadcaster, FrontController.<BR>Event用于在应用不同的层之间传递事件, 并携带事件的数据. 包含type和data两个成员. <BR>type存放一个区别不同事件的名称,将会在FrontController中进行注册. <BR>而在命令(Command)类中, 会对事件进行响应.<BR><BR>EventBroadcaster是一个单例类(singleton), 用于广播用户动作对应的事件. 使用方法: EventBroadcaster.getInstance().broadcastEvent( ... )<BR><BR>FrontController稍微复杂一点点. 用于将特定的用户动作分发到指定的命令类. <BR>FrontConroller是请求处理的核心类. 整个体系中遍布的EventBroadcaster.getInstance().broadcastEvent( ... )这样的调用, <BR>都是用来通知监听控制器: 用户发出了请求. 在实际应用中, 开发者应该生成一个FrontContoller的子类, <BR>并在构造函数中调用addCommand()注册预期事件的处理命令. FrontController的具体实现类应该创建一次而且只能创建一次. <BR>通常的做法是这样的: 在主应用中, 将FrontController的子类作为一个Tag进行申明,&nbsp; <BR>&nbsp;* &lt;p&gt;<BR>&nbsp;* &lt;code&gt;<BR>&nbsp;* &lt;mx:Application&nbsp; xmlns:control="com.domain.project.control.LoginController"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ... &gt;<BR>&nbsp;*<BR>&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;control:LoginController id="controller" /&gt;<BR>&nbsp;*<BR>&nbsp;*&nbsp; ...<BR>&nbsp;* <BR>&nbsp;* &lt;/code&gt;<BR>&nbsp;* &lt;/p&gt;<BR>FrontController的处理实质上是这样的, 在调用addCommamd时, 将处理命令保存在数组中, 将与之对应的事件处理对象注册为FrontController本身, <BR>在事件触发, 调用FrontController的handleEvent时, 调用executeCommand, 在executeCommand中, 先在数组查找出事件对应的命令, <BR>调用命令的execute方法. 这就要求所有的命令都实现Command接口</P>
<P>(内容较多, 未完待续)</P><img src ="http://www.blogjava.net/usherlight/aggbug/33918.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/usherlight/" target="_blank">云自无心水自闲</a> 2006-03-06 20:44 <a href="http://www.blogjava.net/usherlight/archive/2006/03/06/33918.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>