??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲高清在线视频,色婷婷久久久,一区二区三区四区视频在线http://www.aygfsteel.com/usherlight/category/18754.html天^׃白云泉,云自无心水自闌Ӏ何必奔冲山下去Q更LL向人间Q?/description>zh-cnTue, 10 Apr 2007 12:05:03 GMTTue, 10 Apr 2007 12:05:03 GMT60整理了一下Cairngorm 2.1版本的新变化http://www.aygfsteel.com/usherlight/archive/2007/04/10/109722.html云自无心水自?/dc:creator>云自无心水自?/author>Tue, 10 Apr 2007 11:48:00 GMThttp://www.aygfsteel.com/usherlight/archive/2007/04/10/109722.htmlhttp://www.aygfsteel.com/usherlight/comments/109722.htmlhttp://www.aygfsteel.com/usherlight/archive/2007/04/10/109722.html#Feedback0http://www.aygfsteel.com/usherlight/comments/commentRss/109722.htmlhttp://www.aygfsteel.com/usherlight/services/trackbacks/109722.html1. Caringorm2.1的包中增加了完整的ASDoc文档

2. 增加LocaleQ错误信息的国际化的处理?br>d了一个Properties文gQ?br>d了com.adobe.cairngorm.CairngormMessageCodes和com.adobe.cairngorm.CairngormError两个c,其中CairngormMessageCodes用于定义Properties文g中的键|而CairngormError装了ErrorQ在应用执行的过E不再直接抛出ErrorQ而抛Z个CairngormErrorQ其中带一个参数就是MessageCodeQ根据MessageCode到Properties文g中取出相应的消息?/p>

3. 在business中,d了一个IServiceLocator的接?br>ServiceLocator实现IServiceLocator接口Q相比以前增加了以下几个ҎQ?br>a、public function getRemoteObject( serviceId : String ) : RemoteObject // Return the RemoteObject for the given service id.
b、public function getHTTPService( serviceId : String ) : HTTPService // Return the HTTPService for the given service id.
c、public function getWebService( serviceId : String ) : WebService // Return the WebService for the given service id.
d、public function getConsumer( serviceId : String ) : Consumer  // Return the message Consumer for the given service id.
e、public function getProducer( serviceId : String ) : Producer // Return the message Produce for the given service id.
f、public function getDataService( serviceId : String ) : DataService // Return the DataService for the given service id.
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

原来的getService和getInvokerServiceҎ已经废弃Q改ZgetRemoteObject

4. 在Command中,增加了ICommand接口Q原来的Command接口l承ICommand

5. 在VO中,增加了IValueObject接口Q原来的ValueObjectl承IValueObject接口

上面d的几个接口,除了IServiceLocator相较2.0版本有了较大的变化,增加了一些方法,其他的几个接口,依我所见,Ua是换了名字而已?/p>

 



]]>
一个Cairngorm的代码生成器http://www.aygfsteel.com/usherlight/archive/2007/03/24/106000.html云自无心水自?/dc:creator>云自无心水自?/author>Fri, 23 Mar 2007 16:13:00 GMThttp://www.aygfsteel.com/usherlight/archive/2007/03/24/106000.htmlhttp://www.aygfsteel.com/usherlight/comments/106000.htmlhttp://www.aygfsteel.com/usherlight/archive/2007/03/24/106000.html#Feedback0http://www.aygfsteel.com/usherlight/comments/commentRss/106000.htmlhttp://www.aygfsteel.com/usherlight/services/trackbacks/106000.htmlCaringen是一个Eric Feminella自己开发的一个小工具. 现在他把q个工具׃n出来.
Cairngenq不能让所有的x有的问题, 它只是简单地加快开发的q程.

Cairngen是一个Caringorm的代码生成器, 它得开发者可以很方便地生成Cairngorm目的结构框? 包括: Cairngorm目的目录结? 一个缺省的ModelLocator, Controller, ServiceLocator. Cairngen也可以生成Event, Command, Delegatec?

Cairngen使用Flex2和PHP5.2.0开? 利用了AMFPHP. 安装q程十分方便. 你可以在Flex Builder的浏览器中直接运行Cairngen来快速方便地生成Cairngorm的类.

Cairngen使用'步骤(Sequence)'来描qEvent, Command, DelegatecM间的关系.
在Cairngen中只要命名一?步骤',点击一下生成按钮就可以生成一?步骤'. 然后h一下Flex目, 生成的类OK? 在一些特D的情况? 你不希望dDelegatec? 那么你可以选择排除Delegatecȝ生成, q样的话, Cairngen只生成Event和Command.
生成的Commandcd现Cairngorm的Command接口, 但不实现IResponder接口. Cairngenq能够正地事件强制性{?casting)为Coand中的cd, qimport所有相关的c?

pȝ需?
1. 了解AMFPHP, Apache2.0.59和PHP5.2.0, 在用Cairngen之前要求先安装AMFPHP, 而且gateway.php的访问虚拟目录应该如下设|? http://localhost/amfphp/gateway.php. ?.0版正式发布后, q个URL可以自由配置.
2. q需要安装Flex2, PHP, 你可以用WAMP5来集成安装Apache5.5和PHP. 安装好PHP和AMFPHP? 可以解压羃Cairngen Alpha 1. 把services目录复制到amfphp的根目录? 然后复制cairgen-ui目录到apache的www根目录下.

使用:
安装好PHP和AMFPHP? 可以开始用Cairngen? 打开览器输?a href="http://localhost/cairngen-ui/Cairngen.html">http://localhost/cairngen-ui/Cairngen.html打开生成器的囑Ş界面. 创徏Cairgen目:
点击 begin
l你的Cairngen目命名. q个名称与Flex目的名U相? 选择你的Cairngorm的版? 选择Flex目的\? 讄目中包路径(比如: com.domain.projectname). 最? 验一下输入内? 点击"Create Project". hFlex目查看~省的Cairngorm目l构, ModelLocator, Service和Controllerc?

创徏"步骤":

首先是给步骤命名, 然后选择是否要生成Delegatec? 点击生成, q刷新Flex目. 可以发现需要的cdl生成完毕了. 现在需要把它们d到Controller?
接下来编辑模板文? 你可以修Ҏ板文?.tpl)来实C的特定的Cairngorm需? 模板文g?amfphp\services\com\ericfeminella\cairngen\templates目录?

生成器下载地址: http://code.ericfeminella.com/cairngen/Cairngen%20Alpha%201%20PreRelease.zip



]]>
~写ActionScript3.0中需要注意的10个问?/title><link>http://www.aygfsteel.com/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.aygfsteel.com/usherlight/archive/2007/01/26/96236.html</guid><wfw:comment>http://www.aygfsteel.com/usherlight/comments/96236.html</wfw:comment><comments>http://www.aygfsteel.com/usherlight/archive/2007/01/26/96236.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/usherlight/comments/commentRss/96236.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/usherlight/services/trackbacks/96236.html</trackback:ping><description><![CDATA[<p>ȝh需要注意的原则是Q尽量在~译的阶D发现错误,因ؓq时发现q解决错误远q要比在q行时出错解册v来容易的多。可是实际情况中很多人经怼q反q一原则Q下面是我列丄10个技?<br /><br />1) 永远不要使用'Object' 来存储数? 因ؓq是一U绕开~译器检查的做法Q完全不W合面向对象的思想。如果要用Hashmap或者相应的数组Q那么可以用Dictionary。否则,误已定义一个类Q而不要用Object来作为数据的存储器?br /><br />2) 不要用Object来作为对象的cd。这是欺骗编译器的方法。如果必这LQ最好在存取属性或者调用函数时Q先q行强制性的cd转换Q至这是给~译器的一个提C,也帮助其他h理解你的代码?/p> <p>3) 也不要用*cd?/p> <p>4) 不要ActionScript的类声明为动态?/p> <p>5) 注意Application.application (和其他的无类型的框架属?. q个属性有一些古?  他应该是Applicatoncd的,因ؓ他指向的实例必须是Application的子c? 但实际上他的cd?Object', 无法应用~译时的查。如果你一定要用,最好也q行cd的强制性{换?</p> <blockquote> <p>MyApplication( Application.application ).functionCall();</p> </blockquote> <p>6) 装你的Xml。用Xml与Serverq行数据的交互非常方便,但是量避免使用Xml作ؓ核心数据模型。从服务器收到数据后Q尽量把Xml转换为强cd的对象模型。在Flex应用内部使用Xml是绕开~译器的作法?</p> <p>7) 不要使用DynamicEvent. </p> <p>8) 不要使用mx:Model。如上所qͼ请尽量用自定义的强cd的类.</p> <p>9) 不要使用Cairngorm中的data属性,而应该承扩展CairngormEvent来传递数据?/p> <p>10) 不要把编译器的严格模式关?/p><img src ="http://www.aygfsteel.com/usherlight/aggbug/96236.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/usherlight/" target="_blank">云自无心水自?/a> 2007-01-26 23:58 <a href="http://www.aygfsteel.com/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 Betahttp://www.aygfsteel.com/usherlight/archive/2007/01/25/96040.html云自无心水自?/dc:creator>云自无心水自?/author>Thu, 25 Jan 2007 13:08:00 GMThttp://www.aygfsteel.com/usherlight/archive/2007/01/25/96040.htmlhttp://www.aygfsteel.com/usherlight/comments/96040.htmlhttp://www.aygfsteel.com/usherlight/archive/2007/01/25/96040.html#Feedback2http://www.aygfsteel.com/usherlight/comments/commentRss/96040.htmlhttp://www.aygfsteel.com/usherlight/services/trackbacks/96040.htmlCairngorm is being packaged. Cairngorm 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 Cairngorm into the core Cairngorm and Cairngorm Enterprise - this also starts aligning Cairngorm with Steven Webster's presentation at Max when he spoke about the Cairngorm Roadmap. We're also now going to to distribute Cairngorm in Binary form (SWC), as a source zip and a documentation zip.

* Removed dependency on Flex Data Services (fds.swc) - externalised to Cairngorm Enterprise
* Flex SDK SWCs are no longer linked into Cairngorm.swc (produces a smaller cairngorm.swc)
* Added support for setting remote credentials
* Fixed bug with Web services not loading the WSDL (no need to call loadWSDL() explicitly)
* ModelLocator interface has been deprecated. Added com.adobe.cairngorm.model.IModelLocator
* Added deprecation metadata for compiler support

对于我来_x的只有一点:ModelLocator被改成IModelLocator了?br />其他的只是Cairngorm的打包方式而已?br />Cairngorm2.1中依赖于fds.swcQ而fds.swc不是Flex SDK中的东西Q是FDS的一部分?br />?.2中会Cairngorm拆成两部分:Core Cairngorm和Cairngorm Enterprise
和FDS.swc相关的部分放入Cairngorm Enterprise中?img src ="http://www.aygfsteel.com/usherlight/aggbug/96040.html" width = "1" height = "1" />

]]>
Cairngorm中Model数据变化后如何自动调用一个自定义函数Q?/title><link>http://www.aygfsteel.com/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.aygfsteel.com/usherlight/archive/2007/01/07/92181.html</guid><wfw:comment>http://www.aygfsteel.com/usherlight/comments/92181.html</wfw:comment><comments>http://www.aygfsteel.com/usherlight/archive/2007/01/07/92181.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/usherlight/comments/commentRss/92181.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/usherlight/services/trackbacks/92181.html</trackback:ping><description><![CDATA[<p> </p> <p>在Flex的开发过E中Q尤其是在用Cairngorm的时候,M遇到需要在Model的属性值改变后Q需要调用一个指定的函数。传l的解决Ҏ是用一个SetterҎQ在q个Ҏ中首先对属性赋|然后调用指定的函敎ͼ比如Q?/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>但是现在我们有一个更z的解决之道<br />首先dq样一个类<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 /><util:Observe source="{ model.myProperty }" <br />              handler="{ this.myFunction }"/><br />使用了这L一个标{֐Q今后嘦是对model.myPropertyq行赋|׃调用myFunction<br />q个L世上最的标签是不是很好用啊?<br /></p><img src ="http://www.aygfsteel.com/usherlight/aggbug/92181.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/usherlight/" target="_blank">云自无心水自?/a> 2007-01-07 02:15 <a href="http://www.aygfsteel.com/usherlight/archive/2007/01/07/92181.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CairngormCZ--业务逻辑如何理视图QIIIQ?/title><link>http://www.aygfsteel.com/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.aygfsteel.com/usherlight/archive/2006/12/29/90621.html</guid><wfw:comment>http://www.aygfsteel.com/usherlight/comments/90621.html</wfw:comment><comments>http://www.aygfsteel.com/usherlight/archive/2006/12/29/90621.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/usherlight/comments/commentRss/90621.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/usherlight/services/trackbacks/90621.html</trackback:ping><description><![CDATA[<p>现在我们增加验证、格式化和一些其他的功能?br />W四ơP?-d功能<br />现在我们回过头来看那个单视图的应用,增加一点真实性,我们模拟一下远E服务有一点g时。我们在Delegate中用flash.utils.setTimeOut来模拟g时?br />通常Q当q程服务在处理时QUI会展C个进度条Q禁用一部分控gQ让用户明白不能再派发新的请求。在我们的例子中在远E服务在处理的时候,我们会禁用“Get Quote”按钮。完成这一点很ҎQ只需要在Model对象的StockQuotecM增加一个成员isPendingQ把它定义ؓ一个bool形,q样可以直接应用于绑定?/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.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" /> <span style="COLOR: #000000">[Bindable]<br /><img src="http://www.aygfsteel.com/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 />我们现在d对股报L验证功能Q对于这一点,我们可以使用mx.validators.StringValidator来完成这一功能。应用中q两个参数共同控制按钮的有效性。这样可以在Model对象中设|一个isValid属性,用于l合q两参数?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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/images/dot.gif" /> </span> <span id="Codehighlighter1_35_81_Open_Text"> <span style="COLOR: #000000">{<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />    isValid </span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000"> ( isSymbolValid </span> <span style="COLOR: #000000">&&</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #000000">!</span> <span style="COLOR: #000000">isPending );<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span> </span> </div> <p>isSymbolValid是一个属性,存放StringValidator的结果?br />在StockMarketPod.mxml中添加mx:StringValidatorq个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.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" /> <span style="COLOR: #0000ff"><</span> <span style="COLOR: #800000">mx:StringValidator <br /><img src="http://www.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" />    invalid</span> <span style="COLOR: #0000ff">="stockQuote.validateSymbol( false );"</span> <span style="COLOR: #0000ff">/></span> </div> <p> <br />从视图中直接调用Model对象不符合MVC原则Q因囑֎则上只能z֏事g。但在这个例子中Q这样已l够好了?/p> <p>增加格式?br />我们股报价以金额的方式进行展C,在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.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" /> <span style="COLOR: #0000ff"><</span> <span style="COLOR: #800000">mx:CurrencyFormatter <br /><img src="http://www.aygfsteel.com/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.aygfsteel.com/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">/></span> <span style="COLOR: #000000"> <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" />formatter的结果进行绑?br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" /></span> <span style="COLOR: #0000ff"><</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">/></span> </div> <p> <br />现在看一下完整的StockQuotec?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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/images/dot.gif" /> </span> <span id="Codehighlighter1_52_734_Open_Text"> <span style="COLOR: #000000">{<br /><img src="http://www.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/images/dot.gif" /> </span> <span id="Codehighlighter1_80_732_Open_Text"> <span style="COLOR: #000000">{<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />        [Bindable]<br /><img src="http://www.aygfsteel.com/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.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />        [Bindable]<br /><img src="http://www.aygfsteel.com/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.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />        [Bindable]<br /><img src="http://www.aygfsteel.com/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.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />                <br /><img src="http://www.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />                <br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />        [Bindable]<br /><img src="http://www.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/images/dot.gif" /> </span> <span id="Codehighlighter1_384_410_Open_Text"> <span style="COLOR: #000000">{<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />            </span> <span style="COLOR: #0000ff">return</span> <span style="COLOR: #000000"> _isPending;<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />        }</span> </span> <span style="COLOR: #000000"> <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />        <br /><img src="http://www.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/images/dot.gif" /> </span> <span id="Codehighlighter1_475_517_Open_Text"> <span style="COLOR: #000000">{<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />            _isPending </span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000"> value;<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />            validate();<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />        }</span> </span> <span style="COLOR: #000000"> <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />            <br /><img src="http://www.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/images/dot.gif" /> </span> <span id="Codehighlighter1_586_633_Open_Text"> <span style="COLOR: #000000">{<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />            isSymbolValid </span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000"> isValid;<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />            validate();<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />        }</span> </span> <span style="COLOR: #000000"> <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />        <br /><img src="http://www.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/images/dot.gif" /> </span> <span id="Codehighlighter1_677_727_Open_Text"> <span style="COLOR: #000000">{<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />            isValid </span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000"> ( isSymbolValid </span> <span style="COLOR: #000000">&&</span> <span style="COLOR: #000000"> </span> <span style="COLOR: #000000">!</span> <span style="COLOR: #000000">isPending );<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />        }</span> </span> <span style="COLOR: #000000">        <br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span> </span> <span style="COLOR: #000000"> <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span> </span> <span style="COLOR: #000000"> <br /> <img src="http://www.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" />         <br /><img src="http://www.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/images/dot.gif" /> </span> <span id="Codehighlighter1_180_461_Open_Text"> <span style="COLOR: #000000">{<br /><img src="http://www.aygfsteel.com/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.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />             <br /><img src="http://www.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />    delegate.getQuoteForSymbol( symbol );    <br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span> </span> <span style="COLOR: #000000"> <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" />        <br /><img src="http://www.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/images/dot.gif" /> </span> <span id="Codehighlighter1_518_722_Open_Text"> <span style="COLOR: #000000">{<br /><img src="http://www.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span> </span> <span style="COLOR: #000000"> <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" />        <br /><img src="http://www.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/images/dot.gif" /> </span> <span id="Codehighlighter1_778_899_Open_Text"> <span style="COLOR: #000000">{<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />    stockQuote.lastStockQuote </span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000"> NaN;<br /><img src="http://www.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" /> <span style="COLOR: #0000ff"><?</span> <span style="COLOR: #ff00ff">xml version="1.0" encoding="utf-8"</span> <span style="COLOR: #0000ff">?></span> <span style="COLOR: #000000"> <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" /> </span> <span style="COLOR: #0000ff"><</span> <span style="COLOR: #800000">mx:Panel <br /><img src="http://www.aygfsteel.com/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.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" />    xmlns:util</span> <span style="COLOR: #0000ff">="com.adobe.cairngorm.samples.dashboard.util.*"</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000"> <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" />        <br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" />    </span> <span style="COLOR: #0000ff"><</span> <span style="COLOR: #800000">mx:Script</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000"> <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" />        </span> <span style="COLOR: #0000ff"><![CDATA[</span> <span style="COLOR: #808080"> <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" />            import com.adobe.cairngorm.control.CairngormEventDispatcher;<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" />            import com.adobe.cairngorm.samples.dashboard.model.StockQuote;<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" />            import com.adobe.cairngorm.samples.dashboard.events.GetStockQuoteEvent;    <br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" />            <br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" />            [Bindable]<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" />            public var stockQuote : StockQuote;<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" />            <br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" />            private function getQuoteForSymbol() : void<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" />            {<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" />                var event : GetStockQuoteEvent = new GetStockQuoteEvent( symbolTextInput.text );<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" />                CairngormEventDispatcher.getInstance().dispatchEvent( event );<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" />            }<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" />        </span> <span style="COLOR: #0000ff">]]></span> <span style="COLOR: #000000"> <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" />    </span> <span style="COLOR: #0000ff"></</span> <span style="COLOR: #800000">mx:Script</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000"> <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" />    <br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" />    </span> <span style="COLOR: #0000ff"><</span> <span style="COLOR: #800000">mx:CurrencyFormatter <br /><img src="http://www.aygfsteel.com/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.aygfsteel.com/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">/></span> <span style="COLOR: #000000"> <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" />        <br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" />    </span> <span style="COLOR: #0000ff"><</span> <span style="COLOR: #800000">mx:StringValidator <br /><img src="http://www.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" />        invalid</span> <span style="COLOR: #0000ff">="stockQuote.validateSymbol( false );"</span> <span style="COLOR: #0000ff">/></span> <span style="COLOR: #000000"> <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" />    <br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" />    </span> <span style="COLOR: #0000ff"><</span> <span style="COLOR: #800000">mx:Form</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000"> <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" />    <br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" />        </span> <span style="COLOR: #0000ff"><</span> <span style="COLOR: #800000">mx:FormItem </span> <span style="COLOR: #ff0000">label</span> <span style="COLOR: #0000ff">="Symbol"</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000"> <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" />            </span> <span style="COLOR: #0000ff"><</span> <span style="COLOR: #800000">mx:TextInput <br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" />                </span> <span style="COLOR: #ff0000">id</span> <span style="COLOR: #0000ff">="symbolTextInput"</span> <span style="COLOR: #0000ff">/></span> <span style="COLOR: #000000"> <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" />            </span> <span style="COLOR: #0000ff"><</span> <span style="COLOR: #800000">mx:Button <br /><img src="http://www.aygfsteel.com/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.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" />                enabled</span> <span style="COLOR: #0000ff">="{ stockQuote.isValid }"</span> <span style="COLOR: #ff0000"> <br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" />                click</span> <span style="COLOR: #0000ff">="getQuoteForSymbol();"</span> <span style="COLOR: #0000ff">/></span> <span style="COLOR: #000000"> <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" />        </span> <span style="COLOR: #0000ff"></</span> <span style="COLOR: #800000">mx:FormItem</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000"> <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" />                <br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" />        </span> <span style="COLOR: #0000ff"><</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">></span> <span style="COLOR: #000000"> <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" />            </span> <span style="COLOR: #0000ff"><</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">/></span> <span style="COLOR: #000000"> <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" />            </span> <span style="COLOR: #0000ff"><</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">/></span> <span style="COLOR: #000000"> <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" />        </span> <span style="COLOR: #0000ff"></</span> <span style="COLOR: #800000">mx:FormItem</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000"> <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" />        <br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" />    </span> <span style="COLOR: #0000ff"></</span> <span style="COLOR: #800000">mx:Form</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000">    <br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" /></span> <span style="COLOR: #0000ff"></</span> <span style="COLOR: #800000">mx:Panel</span> <span style="COLOR: #0000ff">></span> </div> <p> <br />此视图中我们不需要用ModelLocatorQ而是使用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.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" /> <span style="COLOR: #0000ff"><</span> <span style="COLOR: #800000">mx:Script</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000"> <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" />    </span> <span style="COLOR: #0000ff"><![CDATA[</span> <span style="COLOR: #808080"> <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" />        import com.adobe.cairngorm.samples.dashboard.model.ModelLocator;<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" />        import com.adobe.cairngorm.samples.dashboard.model.StockQuote;<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" />                                    <br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" />        [Bindable]<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" />        private var model : ModelLocator = ModelLocator.getInstance();<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" />        [Bindable]<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" />        private var stockQuote : StockQuote = model.stockQuote;    <br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" />    </span> <span style="COLOR: #0000ff">]]></span> <span style="COLOR: #000000"> <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" /> </span> <span style="COLOR: #0000ff"></</span> <span style="COLOR: #800000">mx:Script</span> <span style="COLOR: #0000ff">></span> <span style="COLOR: #000000"> <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" /> <br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" /></span> <span style="COLOR: #0000ff"><</span> <span style="COLOR: #800000">view:StockMarketPod <br /><img src="http://www.aygfsteel.com/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.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" />    title</span> <span style="COLOR: #0000ff">="Stockmarket Pod"</span> <span style="COLOR: #0000ff">/></span> </div> <p> </p> <p>只传递需要的信息l视图是一个比较好的做法,而尽量少使用ModelLocatorq样的全局变量Q这样也使用视图重用性更高?br /></p><img src ="http://www.aygfsteel.com/usherlight/aggbug/90621.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/usherlight/" target="_blank">云自无心水自?/a> 2006-12-29 00:36 <a href="http://www.aygfsteel.com/usherlight/archive/2006/12/29/90621.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CairngormCZ--业务逻辑如何理视图QIIQ?/title><link>http://www.aygfsteel.com/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.aygfsteel.com/usherlight/archive/2006/12/28/90406.html</guid><wfw:comment>http://www.aygfsteel.com/usherlight/comments/90406.html</wfw:comment><comments>http://www.aygfsteel.com/usherlight/archive/2006/12/28/90406.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/usherlight/comments/commentRss/90406.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/usherlight/services/trackbacks/90406.html</trackback:ping><description><![CDATA[<p>上次介绍了如何在业务逻辑中改变视图,q次讲解一U新Ҏ。我们的股票市场昄囑ְ扩展为多股票报h查询器。我们将看到业务逻辑是怎么调整每个视图的。而且我们q会接触到无状态命令是怎么使得事情变得单?br />W三ơP?-创徏业务逻辑理多视?br />我们l常可以发现会有很多个类型一L视图Q其背后的功能也非常cM。每个视图显CZ个Model对象。这些视囑֏以在开始时从管理对象处h一个Model对象。比如:我们的StockMarketDashboard.mxml可以q行q样的添加:<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.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" /> <span style="COLOR: #0000ff"><</span> <span style="COLOR: #800000">view:StockMarketPod <br /><img src="http://www.aygfsteel.com/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.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" />    title</span> <span style="COLOR: #0000ff">="Stockmarket first pod"</span> <span style="COLOR: #0000ff">/></span> <span style="COLOR: #000000"> <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" /> </span> <span style="COLOR: #0000ff"><</span> <span style="COLOR: #800000">view:StockMarketPod <br /><img src="http://www.aygfsteel.com/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.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" />    title</span> <span style="COLOR: #0000ff">="Stockmarket second pod"</span> <span style="COLOR: #0000ff">/></span> <span style="COLOR: #000000"> <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" /> </span> <span style="COLOR: #0000ff"><</span> <span style="COLOR: #800000">view:StockMarketPod <br /><img src="http://www.aygfsteel.com/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.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" />    title</span> <span style="COLOR: #0000ff">="Stockmarket third pod"</span> <span style="COLOR: #0000ff">/></span> <span style="COLOR: #000000"> <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" /> </span> <span style="COLOR: #0000ff"><</span> <span style="COLOR: #800000">view:StockMarketPod <br /><img src="http://www.aygfsteel.com/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.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" />    title</span> <span style="COLOR: #0000ff">="Stockmarket fourth pod"</span> <span style="COLOR: #0000ff">/></span> </div> <p>注意Q视N要传递一些唯一的标识,我们这些标识添加到StockQuotecR?/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/images/dot.gif" /> </span> <span id="Codehighlighter1_52_190_Open_Text"> <span style="COLOR: #000000">{<br /><img src="http://www.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/images/dot.gif" /> </span> <span id="Codehighlighter1_80_188_Open_Text"> <span style="COLOR: #000000">{<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />        [Bindable]<br /><img src="http://www.aygfsteel.com/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.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />        [Bindable]<br /><img src="http://www.aygfsteel.com/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.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span> </span> <span style="COLOR: #000000"> <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span> </span> </div> <p> <br />理对象StockQuoteManagerQ在ModelLocator实例中初始化。但是StockQuoteManager会是一个怎样的对象呢Q?br />通常我用Hashmap来实玎ͼ光值就是视图中的唯一标识W。在构造函C我们可以初始化这个HashmapQFlex2中我们用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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/images/dot.gif" /> </span> <span id="Codehighlighter1_37_72_Open_Text"> <span style="COLOR: #000000">{<br /><img src="http://www.aygfsteel.com/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.aygfsteel.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span> </span> </div> <p> <br />getStockQuoteҎq回一个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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/images/dot.gif" /> </span> <span id="Codehighlighter1_63_261_Open_Text"> <span style="COLOR: #000000">{<br /><img src="http://www.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/images/dot.gif" /> </span> <span id="Codehighlighter1_129_217_Open_Text"> <span style="COLOR: #000000">{<br /><img src="http://www.aygfsteel.com/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.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />        stockQuotes[ key ] </span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000"> stockQuote;<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span> </span> <span style="COLOR: #000000"> <br /> <img src="http://www.aygfsteel.com/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.aygfsteel.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span> </span> </div> <p> <br />StockMarketPod.mxml几乎没有什么改动。只需要将那个唯一的标识符发送给命oQ因为命令需要从理对象处取得StockQuote对象。所以GetStockQuoteEventcd了一个quoteId属性?br />在GetStockQuoteCommand中,需要将唯一标识W保存在一个成员变量中<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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" />         <br /><img src="http://www.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/images/dot.gif" /> </span> <span id="Codehighlighter1_154_429_Open_Text"> <span style="COLOR: #000000">{<br /><img src="http://www.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />    quoteId </span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000"> stockQuoteEvent.quoteId;<br /><img src="http://www.aygfsteel.com/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.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />    delegate.getQuoteForSymbol( symbol );<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span> </span> <span style="COLOR: #000000"> <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" />        <br /><img src="http://www.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/images/dot.gif" /> </span> <span id="Codehighlighter1_496_747_Open_Text"> <span style="COLOR: #000000">{<br /><img src="http://www.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />    stockQuote.lastStockQuote </span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000"> lastStockQuote;<br /><img src="http://www.aygfsteel.com/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.aygfsteel.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span> </span> <span style="COLOR: #000000"> <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" />        <br /><img src="http://www.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/images/dot.gif" /> </span> <span id="Codehighlighter1_812_980_Open_Text"> <span style="COLOR: #000000">{<br /><img src="http://www.aygfsteel.com/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.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />    stockQuote.lastStockQuote </span> <span style="COLOR: #000000">=</span> <span style="COLOR: #000000"> NaN;<br /><img src="http://www.aygfsteel.com/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.aygfsteel.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span> </span> </div> <p>注意一下,在上面的代码中我们用的是无状态命令,在Cairngorm的说明中Q无状态命令是每次Cairngorm事g的响应都创徏一个新的命令实例的方式。因此,在这U方式中我们可以攑ֿ地把变量存储在成员变量中Q而不用担心被其他人改变?br /></p><img src ="http://www.aygfsteel.com/usherlight/aggbug/90406.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/usherlight/" target="_blank">云自无心水自?/a> 2006-12-28 00:50 <a href="http://www.aygfsteel.com/usherlight/archive/2006/12/28/90406.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CairngormCZ--业务逻辑如何理视图QIQ?/title><link>http://www.aygfsteel.com/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.aygfsteel.com/usherlight/archive/2006/12/27/90195.html</guid><wfw:comment>http://www.aygfsteel.com/usherlight/comments/90195.html</wfw:comment><comments>http://www.aygfsteel.com/usherlight/archive/2006/12/27/90195.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/usherlight/comments/commentRss/90195.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/usherlight/services/trackbacks/90195.html</trackback:ping><description><![CDATA[<p>当服务端或者客L的逻辑变化后,有很多种Ҏ来更新视图。我比较推荐使用ModelLocator{略Q主要是使用Flex的绑定功能?br />通常你的视图与ModelLocator的属性绑定,q些属性可以由命o或者其他的业务逻辑或者其他视图所改变。而一旦这些属性发生了变化Q所有与它们l定的视N随之变化?br />因ؓ很多的Cairngorm的例子都惛_得浅显易懂,因此l常是简单地这些属性做为ModelLocator中的一个暴露给外界的成员变量。而当Cairngorm的应用变得庞大的时候,q往往是不够的。在此我会专门针对q个问题展示一个例子。这个例子是一个股市场的昄表?br /><strong>W一ơP代:应用运转v?br /></strong>首先看一下Cairngorm所d的MVC模式。目前股市场显C只包含一些简单的UI控制。点几ZGetQuote”来z֏Cairngorm事gQ调用命令来h一个新报h。StockMarketPod.mxml中在Button的Click事g中派发Cairngorm事g?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.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" /> <span style="COLOR: #0000ff"><</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">/></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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/images/dot.gif" /></span><span id="Codehighlighter1_125_234_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.aygfsteel.com/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.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />    dispatchEvent( event );<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div><p>GetStockQuoteCommand响应q处理这个Cairngorm事gQ请求一个业务代理类来报仗?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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/images/dot.gif" /></span><span id="Codehighlighter1_57_228_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />    delegate.getQuoteForSymbol( symbol );<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div><p><br />在实际情况中Q需要进行一个远E的服务器端的调用,在Demo中,为简化v见,我注释掉了远E调用的相关代码。这里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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/images/dot.gif" /></span><span id="Codehighlighter1_61_197_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">disabled for demo<br /><img src="http://www.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="COLOR: #000000"><br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" />        <br /><img src="http://www.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/images/dot.gif" /></span><span id="Codehighlighter1_262_524_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">disabled for demo<br /><img src="http://www.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/images/dot.gif" /></span><span id="Codehighlighter1_460_486_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />        responder.onFault();<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/images/dot.gif" /></span><span id="Codehighlighter1_495_522_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />        responder.onResult();<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div><p>我们的StockMarketPod视图只需要两条消息,<br />1. 股票的报?br />2. 错误消息<br />因ؓ现在是第一ơP代过E中Q处理比较简单,因此使用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.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> var lastStockQuote : Number;<br /><img src="http://www.aygfsteel.com/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命o模拟q回相应的结果?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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/images/dot.gif" /></span><span id="Codehighlighter1_62_215_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />    model.lastStockQuote </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> stockQuote;<br /><img src="http://www.aygfsteel.com/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.aygfsteel.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" /> }</span></span><span style="COLOR: #000000"><br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" />        <br /><img src="http://www.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/images/dot.gif" /></span><span id="Codehighlighter1_280_357_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />    model.lastStockQuote </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> NaN;<br /><img src="http://www.aygfsteel.com/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.aygfsteel.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="COLOR: #000000"><br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" /></span></div><p>StockMarketPod视图l定q些成员q进行一些格式化的处理?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.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff"><</span><span style="COLOR: #800000">mx:FormItem </span><span style="COLOR: #ff0000">label</span><span style="COLOR: #0000ff">="Symbol"</span><span style="COLOR: #0000ff">></span><span style="COLOR: #000000"><br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff"><</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">/></span><span style="COLOR: #000000"><br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff"></</span><span style="COLOR: #800000">mx:FormItem</span><span style="COLOR: #0000ff">></span><span style="COLOR: #000000"><br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff"><</span><span style="COLOR: #800000">mx:FormItem</span><span style="COLOR: #0000ff">></span><span style="COLOR: #000000"><br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff"><</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">/></span><span style="COLOR: #000000"><br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff"></</span><span style="COLOR: #800000">mx:FormItem</span><span style="COLOR: #0000ff">></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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/images/dot.gif" /></span><span id="Codehighlighter1_56_109_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.aygfsteel.com/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.aygfsteel.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div><p><br />现在我们来进行重构ƈ一些功能从视图中抽取出来到一个可以进行单元测试的工具cM?/p><p><strong>W二ơP代,创徏W合需求的业务逻辑</strong><br />现在我们已经有一个可以运行的最单的应用。当你的应用变得庞大后,会有很多的限制。你会发C的ModelLocator非常的臃肿,以致于有时候,你都找不C所要的成员。甚至会有命名冲H的事情发生?br />一个普通的重构Ҏ是封装你的用例图中的成员成ؓ一个业务对象。这个业务对象能够表达业务上下文中需要的视图信息。你可以把业务对象设计得最适合用例囄_度。在一个大型的应用中,你可能会设计一pd的业务对象来表达你的用例。你的视囑ְ会绑定这些对象或者这些对象的属性上。通过q种ҎQModelLocator与其目标之间的联pLҎQ开发者更Ҏ掌握业务逻辑所包含的内宏V?br />在这个Demo中,我们可以把astStockQuote和stockQuoteErrorq两个成员封装到一个业务对象中?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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/images/dot.gif" /></span><span id="Codehighlighter1_52_188_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/images/dot.gif" /></span><span id="Codehighlighter1_80_186_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />        [Bindable]<br /><img src="http://www.aygfsteel.com/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.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" />        [Bindable]<br /><img src="http://www.aygfsteel.com/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.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div><p><br />q样在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.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff"><</span><span style="COLOR: #800000">mx:FormItem </span><span style="COLOR: #ff0000">label</span><span style="COLOR: #0000ff">="Symbol"</span><span style="COLOR: #0000ff">></span><span style="COLOR: #000000"><br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff"><</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">/></span><span style="COLOR: #000000"><br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff"></</span><span style="COLOR: #800000">mx:FormItem</span><span style="COLOR: #0000ff">></span><span style="COLOR: #000000"><br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff"><</span><span style="COLOR: #800000">mx:FormItem</span><span style="COLOR: #0000ff">></span><span style="COLOR: #000000"><br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" />    </span><span style="COLOR: #0000ff"><</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">/></span><span style="COLOR: #000000"><br /><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff"></</span><span style="COLOR: #800000">mx:FormItem</span><span style="COLOR: #0000ff">></span></div><span id="Codehighlighter1_89_235_Open_Text"></span><img src ="http://www.aygfsteel.com/usherlight/aggbug/90195.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/usherlight/" target="_blank">云自无心水自?/a> 2006-12-27 01:31 <a href="http://www.aygfsteel.com/usherlight/archive/2006/12/27/90195.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Z么你不应该用Cairngorm(Steven Webster,Cairngorm的主创h?http://www.aygfsteel.com/usherlight/archive/2006/09/12/69141.html云自无心水自?/dc:creator>云自无心水自?/author>Tue, 12 Sep 2006 05:41:00 GMThttp://www.aygfsteel.com/usherlight/archive/2006/09/12/69141.htmlhttp://www.aygfsteel.com/usherlight/comments/69141.htmlhttp://www.aygfsteel.com/usherlight/archive/2006/09/12/69141.html#Feedback0http://www.aygfsteel.com/usherlight/comments/commentRss/69141.htmlhttp://www.aygfsteel.com/usherlight/services/trackbacks/69141.html使用Cairngorm攑֤或者说是加剧了学习曲线, 大多数第一ơ用Flex的开发者是从创建小的应用开始逐步了解Flex的思想和概? 所以最好先从用容器和lg,创徏动态界?使用WebService/HTTP Service,l定其返回结果这L步骤开?
然后试更新后台的持久数?使用ColdFunsion/Java/C#/PHP{等.q是Flex开发者学习道路上的一个里E碑.
接下?可以ȝ解风?状?效果q样的Flex功能, 在Mxml中写一些ActionScript.
以上的这些步骤都不涉及到Cairngorm,直到你能熟练C用Flex? 可以去阅读Cairngorm的系列文?http://www.adobe.com/devnet/flex/articles/cairngorm_pt1.html)
2. 你的应用与用L交互非常?只有一两个
q主要是用于衡量应用的复杂?如果你的应用中的用户用例(Use-Case)比较?那么Cairngorm对你会非常有h?
相反,如果用例比较?那么你完全可以不使用Cairngorm来完成应?
最好的解决Ҏ不是无物可加,而是无物可舍!
the best solution is not when there is nothing left to add, but when there is nothing left to take away!
3. 你是应用的唯一开发?br />Cairngorm的优Ҏ可控?可维护?伸羃? 在别人的工作基础d功能变得非常非常Ҏ.
而如果只有你一个开发?那么不用Cairngorm会一U简z的做法.
4. 你发CCairngorm的Bug
如果你发CBug,那么׃适合在重要的目中用Cairngorm.
Cairngormq不是完全没有Bug,在早期的Beta版中,和其他Y件品一?我们忽略了一些偶出现的Bug.



]]>
Cairngorm的概要介l、简?/title><link>http://www.aygfsteel.com/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.aygfsteel.com/usherlight/archive/2006/08/31/66777.html</guid><wfw:comment>http://www.aygfsteel.com/usherlight/comments/66777.html</wfw:comment><comments>http://www.aygfsteel.com/usherlight/archive/2006/08/31/66777.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.aygfsteel.com/usherlight/comments/commentRss/66777.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/usherlight/services/trackbacks/66777.html</trackback:ping><description><![CDATA[Cairngorm的组成:<br />1. Model LocatorQ保存应用的ValueObjectQ数据)和共享变量,与HttpSessioncMQ只不过是保存在客户端而不是在服务器端而已<br />2. ViewQ一个或者多个FlexlgQ按钮、Panel、下拉框{等Q组合在成一个被命名的单元。绑定Model Locator中的数据Q根据用户动作(点击、滚动、拖放)产生自定义的Cairngorm事g?br />3. Front ControllerQ接收Cairngorm事gQƈ映射到对应的Cairngorm命o?br />4. CommandQ处理业务逻辑Q调用Cairngorm的代理或者其他命令,更新Model Locator中的Value Object和变量倹{?br />5. DelegateQ在命o中创建,初始化一个远E调用(Http, WebService{等Q,q将q回l果传递给Command?br />6. ServiceQ定义远E调用连接远E的数据存储?br />Cairngorm的工作方式:<br />1. 客户端界面由各个Viewl成QView通过l定Model Locator的成员来昄数据。ViewҎ用户操作生成事g。这些事件由Front Controllerq播q接Ӟ然后映射到相应的命o。命令包含业务逻辑、创Z理来完成操作Q处理代理返回的l果Qƈ更新Model Locator的数据。因为View是与Model Locator中的数据l定的,因此Model Locator中数据更新后QView自动反应出数据的变化。由代理调用服务q返回处理结果不是必ȝQ但是这是推荐做法?img src ="http://www.aygfsteel.com/usherlight/aggbug/66777.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/usherlight/" target="_blank">云自无心水自?/a> 2006-08-31 09:36 <a href="http://www.aygfsteel.com/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的学习笔?结)http://www.aygfsteel.com/usherlight/archive/2006/04/05/39367.html云自无心水自?/dc:creator>云自无心水自?/author>Wed, 05 Apr 2006 05:51:00 GMThttp://www.aygfsteel.com/usherlight/archive/2006/04/05/39367.htmlhttp://www.aygfsteel.com/usherlight/comments/39367.htmlhttp://www.aygfsteel.com/usherlight/archive/2006/04/05/39367.html#Feedback0http://www.aygfsteel.com/usherlight/comments/commentRss/39367.htmlhttp://www.aygfsteel.com/usherlight/services/trackbacks/39367.html1. 首先规划构徏View, 一个应用的界面, 分成适当的Mxml Component
2. view中必然涉及的需要数据的l定, 组仉要的数据都集中到ModelLocator?
3. 设计事g(CairngormEvent), 也就是与用户交互的过E中以及pȝq{的过E中会需要派发哪些事?
需要注意的一Ҏ, Cairngorm中Flex事g也需要{化成CairngormEvent
4. 设计事g的处理函? 也就是命? 在FrontControl中对事g和命令进行注?
5. 命o中通过代理去调用服?
5. 设计代理c? 在代理类中调用服?br />5. 设计命o中涉及的服务(最可能的是与数据库的交?, q添加相应的配置
6. 设计服务中需要用的ValueObject
7. 命o中如果需要对视图lg数据q行存取, 需要通过ViewHelper来完? 设计相应的ViewHelper.
同时在mxml中对viewHelperq行注册.

补充说明: 事g的生不一定全部是与用户交互的l果, 也就是说不全是由View产生?
当然大部分的事g(比如用户点击了保存按?是这样生的.
在命令中也可以生命? 典型的就是SequenceCommand, 应用中可以把一个事件的处理分成几个步骤来完?
完成W?个步骤后怎么通知W?个步骤开始呢, 当然q是l箋z֏事g? 在SequenceCommand在类?
把派发事件封装了一? l出了一个executeNextCommand()可以直接调用.
不过在这里我也遇C一个问? 直接使用SequenceCommand的executeNextCommand()q不用.
好象dispatchEventq没有效? 我后来是自己修改了代? 使用Application.application.dispatchEvent才解决问题的.

Cairngorm的优?
一. 实现了比较彻底的解?br />1. 事g机制, 对用L响应(比如点击保存按钮), q不是直接从View中抓取数? 然后New一个类, 调用q个cȝ某个Ҏ,
数据保存到数据库中, 而只是简单地z֏一个事? 具体事gp来响? 如何处理对他来说是透明不可见的.
2. Locator模式, Cairngorm中service, view, model的获取都是通过Locator?
也就是说pȝ其他部分对于service, view, model只需要知道其ID够? 其内部实现等待细节都是不需要知道的.
举个例子, 传统的方? 你要找一个叫张三的h帮你q一件事, 你需要知道张三长什么样,
然后在一个坐着10个h的大办公室里扑ֈ? 告诉他你的要?
而现在在q个大办公室的门口多了一个前台小? 你只需要告诉这个小?我要扑ּ? 然后她会帮你L,
你根本不需要知道张三的模样.

RIA的优? ׃Flex的原? pȝ处理是异步的.
比如, 你请求了一个比较耗时的数据库d操作, h发出? 你就可以q行其他操作? 服务l束会生相应事?
然后由Commandq行后箋处理, 最后引发页面数据更?



]]>
Iteration::two的基于Flex的开源项?- Cairngorm store的学习笔??http://www.aygfsteel.com/usherlight/archive/2006/03/14/35287.html云自无心水自?/dc:creator>云自无心水自?/author>Tue, 14 Mar 2006 12:26:00 GMThttp://www.aygfsteel.com/usherlight/archive/2006/03/14/35287.htmlhttp://www.aygfsteel.com/usherlight/comments/35287.htmlhttp://www.aygfsteel.com/usherlight/archive/2006/03/14/35287.html#Feedback0http://www.aygfsteel.com/usherlight/comments/commentRss/35287.htmlhttp://www.aygfsteel.com/usherlight/services/trackbacks/35287.html先简要地介绍一下Cairngorm中采用的设计模式:
Cairngorm框架最大的革新是将用户行ؓ和系l事gl一地映ؓCairngorm事g.
当组件接收到用户行ؓ或者系l事件后, 用户h被{换成lg可以传播的内部事? RIA中处理用戯求不需要到服务器去转一?
当用戯为指定要执行一个功能时, Cairngorm要求q播一个合适的事g.
在设计模式中命o模式特别适合此种情Ş. 在这个模式中, 实现功能的cȝ之ؓ命o(Command).
每一个而且是所有的命o提供一个单点入? 一个execute()Ҏ.
q样允许W?方调用此命o, 而不需要了解命令具体是如何实现?
通常q些命o被叫?Worker", 因ؓ他们承担了在应用背后q行工作的Q?

我们现在开始根据示例来研究Cairngorm Store.
看一下Cairngorm Store关键功能之一: 商品添加到购物车中.
为实现此功能, 创徏一个新的命令类: AddProductToShoppingCartCommand
import org.nevis.cairngorm.commands.Command;
import org.nevis.cairngorm.control.Event;
import org.nevis.cairngorm.samples.store.model.ModelLocator;
import org.nevis.cairngorm.samples.store.vo.ProductVO;

class org.nevis.cairngorm.samples.store.command.AddProductToShoppingCartCommand  implements Command  
{
    public 
function execute( event : Event ):Void
    {
        
var product : ProductVO = ProductVO( event.data.product );
        
var quantity : Number = Number( event.data.quantity );
        ModelLocator.shoppingCart.addElement( product, quantity );
    }    
}
q个cȝhq不复杂. 首先一个具体的cdCCairngorm的命令接?
如果你查看了Cairngorm的源? 你会发现q个接口只是单地规定了命令必dC个方? execute() 作ؓ入口.

看一下execute()Ҏ的实? 可以发现事g是如何执行包含ProductVO值对象和数量的命令的.
VO和数量是预先装蝲在EventcM? Event也是一个Caringorm定义的类, 其中包括事g的类型和事g的方?
购物车属于客L数据, 因此它存放于ModelLocatorcM. 所?命o只是d适当数量的商品到购物车中, 使用购物车提供的Ҏ.
q就是创Z个简单功能命令类的所有工? 命o查询事g, 获取事g相关数据.
如果执行的命令更改应用的数据,比如要求在购物R视图中新增一个商? 应用需要用ModelLocater完成更改客户端数?

有一个非帔R要的设计概念在这里强调一? 在前面的CZ?
所有复杂的业务逻辑(比如一个购物R可以做什?不可以做什?都被装在一个类?UC为ShoppingCart).
比如: 一个用h加一个商品到购物车中, 如果购物车没有此U商? 则新增一? 如果已经存在, 则将数量?.

Cairngormq不减轻开发者创Z务对象的工作. 特别之处只是在于它实C务域的类.

开发者应该从Cairngorm架构中抽d? 把业务逻辑从命令中提取出来攑օcM.
一个典型的实现Ҏ是进行抽象类的重? 此项技术的好处在于可以q行单元试, 书写API文档, 使用其他应用开发者可以进行复?
Caringorm商店中的购物车类是遵循此原则的极好的例子.



借鉴设计模式的思想, Cairngorm对客户事件的q行响应而不是对服务器HTTP的进行响?
Cairngorm使用前台控制(Front Controller)模式作ؓ所有Cairngorm事g的统一入口.
class org.nevis.cairngorm.samples.store.control.ShopController extends FrontController
{
    public 
function ShopController()
   {
       initialiseCommands();
   }
    
    
//----------------------------------------------------------------------------

    public 
function initialiseCommands()
    {
      addCommand( ShopController.EVENT_GET_PRODUCTS, 
new GetProductsCommand() );
      addCommand( ShopController.EVENT_ADD_PRODUCT_TO_SHOPPING_CART, 
new AddProductToShoppingCartCommand() );
      addCommand( ShopController.EVENT_DELETE_PRODUCT_FROM_SHOPPING_CART, 
new DeleteProductFromShoppingCartCommand() );  
      addCommand( ShopController.EVENT_FILTER_PRODUCTS, 
new FilterProductsCommand() );     
      addCommand( ShopController.EVENT_SORT_PRODUCTS, 
new SortProductsCommand() );     
      addCommand( ShopController.EVENT_VALIDATE_ORDER, 
new ValidateOrderCommand() );
      addCommand( ShopController.EVENT_VALIDATE_CREDIT_CARD, 
new ValidateCreditCardCommand() );     
      addCommand( ShopController.EVENT_COMPLETE_PURCHASE, 
new CompletePurchaseCommand() );     
    }
    
    
//-------------------------------------------------------------------------

    public static 
var EVENT_GET_PRODUCTS = "getProducts";
    public static 
var EVENT_ADD_PRODUCT_TO_SHOPPING_CART = "addProductToShoppingCart";
    public static 
var EVENT_DELETE_PRODUCT_FROM_SHOPPING_CART = "deleteProductFromShoppingCart";  
    public static 
var EVENT_FILTER_PRODUCTS = "filterProducts";
    public static 
var EVENT_SORT_PRODUCTS = "sortProducts";
    public static 
var EVENT_VALIDATE_ORDER = "validateOrder";
    public static 
var EVENT_VALIDATE_CREDIT_CARD = "validateCreditCard";
    public static 
var EVENT_COMPLETE_PURCHASE = "completePurchase";            
        
}

构造函数调?span style="COLOR: rgb(0,0,0)">initialiseCommands(), 广播的事g委派l相应的命od?

我们看一个添加商品到购物车的例子. 当应用广?font face="新宋?>ShopController.EVENT_ADD_PRODUCT_TO_SHOPPING_CART命o?
前台控制中下面这行代码保证AddProductToShoppingCartCommand的execute()Ҏ被调?
addCommand( ShopController.EVENT_ADD_PRODUCT_TO_SHOPPING_CART, new AddProductToShoppingCartCommand() );

ShopControllerl承了Cairngorm中的FrontController基类, 因此可以使用addCommand()来给事g注册相应的命?
Cairngorm底层架构完成了剩余部分的工作. 应用中Q意地方简单地q播适当的事? Cairngorm保相应的命令被触发.

另外需要做的是在Mxml的主入口点创建控制器. 在Cairngorm商店? 是Main.mxml, 代码如下:
<control:ShopController id="controller" />

"Control"的命名空间在应用标签中定? 指定如下Cairngorm?
xmlns:control="org.nevis.cairngorm.samples.store.control.*"

你只需要这样做,可以保证应用拥有一个前台控制模? 响应所有的事g, q触发你使用addCommand()注册的命?






]]>
Iteration::two的基于Flex的开源项?- Cairngorm store的学习笔??http://www.aygfsteel.com/usherlight/archive/2006/03/09/34513.html云自无心水自?/dc:creator>云自无心水自?/author>Thu, 09 Mar 2006 09:28:00 GMThttp://www.aygfsteel.com/usherlight/archive/2006/03/09/34513.htmlhttp://www.aygfsteel.com/usherlight/comments/34513.htmlhttp://www.aygfsteel.com/usherlight/archive/2006/03/09/34513.html#Feedback0http://www.aygfsteel.com/usherlight/comments/commentRss/34513.htmlhttp://www.aygfsteel.com/usherlight/services/trackbacks/34513.html在笔C中,忘记介绍一下Iteration::two和Cairngorm的背景了?BR>Iteration::two是一家致力于RIA开发的公司?详情LQ?A >http://www.iterationtwo.com/index.html

Macromedia Acquires iteration::two in creation of Macromedia Consulting Europe.

Macromedia acquires iteration::two, an industry-leading software consultancy,  to create a European Rich Internet Application consulting organisation based in Edinburgh , Scotland.
Cairngorm是Iteration::two的开源项目之一。下载和更新地址?A >http://www.iterationtwo.com/open_source_cairngorm.html


好,现在l箋开始我的学习笔讎ͼ
1. 在Control中有Command.as定义了Command接口Q笔C中FrontController中addCommand的调用添加的Command都必d现此接口。Command接口只定义一个唯一的需要实现的Ҏexecute(); q是一个典型的命o模式, 所有后l的命o都实现此接口, 对外l一提供一个单点入口execute(), 其他的h都可以进行调?但不需要了解命令具体的实现方式.

2. 在Model中定义了ModelLocator接口QModalLocator是所有数据绑定的接口Q也是说应用中所有需要进行绑定的数据都需要通过此接口进行定位。在实际的应用中需要实现此接口Qƈ提供所有的l定数据?BR>
3. 在business中定义了两个c?ServiceLocator和Responder?BR>ServiceLocatorq是伪单例类, 应用开发者用于定义ƈ获得服务.
之所以是伪单例类, 是因为ServiceLocator是定义在mxml中的,
它需要一个无参数的Public构造函? 使用中必d义一个ServiceLocator的子c? q在其中定义需要的服务.

代码CZ:首先在Services.mxml中进行如下定?

 * <cairngorm:ServiceLocator xmlns:mx="http://www.macromedia.com/2003/mxml"
 
*                           xmlns:cairngorm="org.nevis.cairngorm.business.*" >
 
*
 
*   <mx:RemoteObject id="customerDelegate" source="org.nevis.cairngorm.samples.login.CustomerDelegate"
 
*                    result="event.call.resultHandler( event )"
 
*                    fault="event.call.faultHandler( event )">
 
*   </mx:RemoteObject>
 
*
 
* </cairngorm:ServiceLocator>

在Flexd用中d一行:
 <business:Services id="services" />
其中business命名I间在应用头部进行申?BR> xmlns:business="org.nevis.cairngorm.samples.store.business.*"
ServiceLocator使用ҎQ?BR>在业务代理类(Delegate)中通过如下方式q行调用:
 *   var service = ServiceLocator.getInstance().getService( "customerDelegate" );


在View中,定义了两个类 ViewLocator和ViewHelper
ViewHelper:用于隔离Command命ocdView视图的具体实?
Z执行业务功能, Commandc需要查询ƈ更改视图,
在执行业务逻辑? 命oc需要从视图中获得用戯入的数据;
业务逻辑l束后又l常需要更改视? 昄执行l果.
通过查询和更改视图的操作封装到单独ViewHelpercM, 命ocd全不需要了解视囄的Q何信?
ViewHelper属于一U特D的视图, 当ViewHelper创徏? p注册到指定的视图.
ViewHelperl承自MXMLObject, 在重写的初始化函?initialized)? 调用ViewLocatorq行注册,
q指定unloadҎ的监听函数unregister, 在unload? 调用unregister, 使用ViewLocator的取消注?

ViewLocator是一个单例类, 用于获取ViewHelper操作视图.
命oc需要通过ViewHelper的方法来查询更改视图, 而ViewLocator即用于让命ocd得需要的ViewHelper.
命ocM需要知道ViewHelper的名U? ViewLocator会返回需要的ViewHelper实例.

现在Cairngorm的基框架已经介绍完毕Q将在以后l介l如何在实际应用中用上面提及的基础框架?BR>





]]>
Iteration::two的基于Flex的开源项?- Cairngorm store的学习笔?一)http://www.aygfsteel.com/usherlight/archive/2006/03/06/33918.html云自无心水自?/dc:creator>云自无心水自?/author>Mon, 06 Mar 2006 12:44:00 GMThttp://www.aygfsteel.com/usherlight/archive/2006/03/06/33918.htmlhttp://www.aygfsteel.com/usherlight/comments/33918.htmlhttp://www.aygfsteel.com/usherlight/archive/2006/03/06/33918.html#Feedback1http://www.aygfsteel.com/usherlight/comments/commentRss/33918.htmlhttp://www.aygfsteel.com/usherlight/services/trackbacks/33918.htmlCairngorm是Iteration::two的开源项? 是用macromedia Flex的RIA开发的最佛_?best-practice)框架.
在Cairngorm基础上开发RIA, 会在Iteration::two的专家体pd现有的灵zdl护企业解决Ҏ中达到^?
Cairngorm本nq不是一个完整的企业应用, 它只是提供了一个开发的骨架, Iteration::twoUCZp?
在这个体pM包括以下几个部分:
1. Business(业务逻辑部分)
2. Command(命o部分)
3. Control(控制部分)
4. Model(数据模型)
5. View(界面视图)
6. VO(ValueObject)

我们从Control说v:
在Control? 定义?个基c? Event, EventBroadcaster, FrontController.
Event用于在应用不同的层之间传递事? q携带事件的数据. 包含type和data两个成员.
type存放一个区别不同事件的名称,会在FrontController中进行注?
而在命o(Command)cM, 会对事gq行响应.

EventBroadcaster是一个单例类(singleton), 用于q播用户动作对应的事? 使用Ҏ: EventBroadcaster.getInstance().broadcastEvent( ... )

FrontControllerE微复杂一点点. 用于特定的用户动作分发到指定的命oc?
FrontConroller是请求处理的核心c? 整个体系中遍布的EventBroadcaster.getInstance().broadcastEvent( ... )q样的调?
都是用来通知监听控制? 用户发出了请? 在实际应用中, 开发者应该生成一个FrontContoller的子c?
q在构造函C调用addCommand()注册预期事g的处理命? FrontController的具体实现类应该创徏一ơ而且只能创徏一?
通常的做法是q样? 在主应用? FrontController的子cMZ个Tagq行x, 
 * <p>
 * <code>
 * <mx:Application  xmlns:control="com.domain.project.control.LoginController"        ... >
 *
 *        <control:LoginController id="controller" />
 *
 *  ...
 *
 * </code>
 * </p>
FrontController的处理实质上是这L, 在调用addCommamd? 处理命令保存在数组? 与之对应的事g处理对象注册为FrontController本n,
在事件触? 调用FrontController的handleEvent? 调用executeCommand, 在executeCommand? 先在数组查找Z件对应的命o,
调用命o的executeҎ. q就要求所有的命o都实现Command接口

(内容较多, 未完待箋)



]]>
վ֩ģ壺 | Ϫ| | | ƽ| ʩ| Ϫ| | | ʹ| | | ƺ| ˮ| | | ƽ| | | »| ֵ| | | ¡| ع| ¡| | | | | ʦ| Դ| ƽ| | | Ƿ| | ƾ| ̨| β| |