云自無心水自閑

          天平山上白云泉,云自無心水自閑。何必奔沖山下去,更添波浪向人間!
          posts - 288, comments - 524, trackbacks - 0, articles - 6
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          現(xiàn)在我們將增加驗證、格式化和一些其他的功能。
          第四次迭代--添加功能
          現(xiàn)在我們回過頭來看那個單視圖的應(yīng)用,增加一點真實性,我們模擬一下遠(yuǎn)程服務(wù)有一點延時。我們在Delegate中使用flash.utils.setTimeOut來模擬延時。
          通常,當(dāng)遠(yuǎn)程服務(wù)在處理時,UI會展現(xiàn)一個進(jìn)度條,禁用一部分控件,讓用戶明白不能再派發(fā)新的請求。在我們的例子中在遠(yuǎn)程服務(wù)在處理的時候,我們會禁用“Get Quote”按鈕。完成這一點很容易,只需要在Model對象的StockQuote類中增加一個成員isPending,把它定義為一個bool形,這樣可以直接應(yīng)用于綁定。

          ?

          [Bindable]
          public ?var?isPending?:?Boolean;

          ?

          增加驗證
          我們現(xiàn)在添加對股票報價的驗證功能,對于這一點,我們可以使用mx.validators.StringValidator來完成這一功能。應(yīng)用中這兩個參數(shù)共同控制按鈕的有效性。這樣可以在Model對象中設(shè)置一個isValid屬性,用于組合這兩參數(shù)。

          private ?function?validate()?:? void
          {
          ????isValid?
          = ?(?isSymbolValid? && ? ! isPending?);
          }

          isSymbolValid是一個屬性,存放StringValidator的結(jié)果。
          在StockMarketPod.mxml中添加mx:StringValidator這個Tag

          < mx:StringValidator?
          ????
          minLength ="2" ?triggerEvent ="change" ?
          ????source
          ="{?symbolTextInput?}" ?property ="text"
          ????valid
          ="stockQuote.validateSymbol(?true?);" ?
          ????invalid
          ="stockQuote.validateSymbol(?false?);" />


          從視圖中直接調(diào)用Model對象不符合MVC原則,因為視圖原則上只能派發(fā)事件。但在這個例子中,這樣已經(jīng)足夠好了。

          增加格式化
          我們將股票報價以金額的方式進(jìn)行展示,在StockMarketPod.mxml中增加一個formatter

          < mx:CurrencyFormatter?
          ????
          id ="standardEuroFormatter" ??
          ????currencySymbol
          ="$" ?precision ="2" />
          將formatter的結(jié)果進(jìn)行綁定
          < mx:Label? text ="{?standardEuroFormatter.format(?stockQuote.lastStockQuote?)?}" />


          現(xiàn)在看一下完整的StockQuote類

          package ?com.adobe.cairngorm.samples.dashboard.model
          {
          ????
          public ? class ?StockQuote
          ????
          {
          ????????[Bindable]
          ????????
          public ?var?lastStockQuote?:?Number;
          ????????[Bindable]
          ????????
          public ?var?isValid?:?Boolean;
          ????????[Bindable]
          ????????
          public ?var?statusMessage?:?String;
          ????????????????
          ????????
          private ?var?_isPending?:?Boolean;
          ????????
          private ?var?isSymbolValid?:?Boolean;
          ????????????????
          ????????[Bindable]
          ????????
          public ?function?get?isPending()?:?Boolean
          ????????
          {
          ????????????
          return ?_isPending;
          ????????}

          ????????
          ????????
          public ?function?set?isPending(?value?:?Boolean?)?:? void
          ????????
          {
          ????????????_isPending?
          = ?value;
          ????????????validate();
          ????????}

          ????????????
          ????????
          public ?function?validateSymbol(?isValid?:?Boolean?)?:? void
          ????????
          {
          ????????????isSymbolValid?
          = ?isValid;
          ????????????validate();
          ????????}

          ????????
          ????????
          private ?function?validate()?:? void
          ????????
          {
          ????????????isValid?
          = ?(?isSymbolValid? && ? ! isPending?);
          ????????}
          ????????
          ????}

          }

          其中isPending屬性的值由GetStockQuoteCommand控制

          private ?var?model?:?ModelLocator? = ?ModelLocator.getInstance();
          private ?var?stockQuote?:?StockQuote? = ?model.stockQuote;
          ?????????
          public ?function?execute(?event?:?CairngormEvent?)?:? void
          {
          ????stockQuote.isPending?
          = ? true ;
          ?????????????
          ????var?stockQuoteEvent?:?GetStockQuoteEvent?
          = ?GetStockQuoteEvent(?event?);??????????
          ????var?symbol?:?String?
          = ?stockQuoteEvent.symbol;
          ????var?delegate?:?StockMarketDelegate?
          = ? new ?StockMarketDelegate(? this ?);
          ????delegate.getQuoteForSymbol(?symbol?);????
          }

          ????????
          public ?function?onResult(?event?:? * ? = ? null ?)?:? void
          {
          ????
          // for?demo?purpose:?event?would?normally?be?an?event?object?of?remote?service?result.????????????
          ????stockQuote.lastStockQuote? = ?event?as?Number;????????????
          ????stockQuote.isPending?
          = ? false ;
          ????stockQuote.statusMessage?
          = ? "" ;
          }

          ????????
          public ?function?onFault(?event?:? * ? = ? null ?)?:? void
          {
          ????stockQuote.lastStockQuote?
          = ?NaN;
          ????stockQuote.statusMessage?
          = ? " Quote?retrieval?error. " ;
          ????stockQuote.isPending?
          = ? false ;
          }

          最后看一下StockMarketPod.mxml的全部代碼

          <? xml?version="1.0"?encoding="utf-8" ?>
          < mx:Panel?
          ????
          xmlns:mx ="http://www.adobe.com/2006/mxml"
          ????xmlns:util
          ="com.adobe.cairngorm.samples.dashboard.util.*" >
          ????????
          ????
          < mx:Script >
          ????????
          <![CDATA[
          ????????????import?com.adobe.cairngorm.control.CairngormEventDispatcher;
          ????????????import?com.adobe.cairngorm.samples.dashboard.model.StockQuote;
          ????????????import?com.adobe.cairngorm.samples.dashboard.events.GetStockQuoteEvent;????
          ????????????
          ????????????[Bindable]
          ????????????public?var?stockQuote?:?StockQuote;
          ????????????
          ????????????private?function?getQuoteForSymbol()?:?void
          ????????????{
          ????????????????var?event?:?GetStockQuoteEvent?=?new?GetStockQuoteEvent(?symbolTextInput.text?);
          ????????????????CairngormEventDispatcher.getInstance().dispatchEvent(?event?);
          ????????????}
          ????????
          ]]>
          ????
          </ mx:Script >
          ????
          ????
          < mx:CurrencyFormatter?
          ????????????????
          id ="standardEuroFormatter" ??
          ????????currencySymbol
          ="$" ?precision ="2" />
          ????????
          ????
          < mx:StringValidator?
          ????????
          minLength ="2" ?triggerEvent ="change" ?
          ????????source
          ="{?symbolTextInput?}" ?property ="text"
          ????????valid
          ="stockQuote.validateSymbol(?true?);" ?
          ????????invalid
          ="stockQuote.validateSymbol(?false?);" />
          ????
          ????
          < mx:Form >
          ????
          ????????
          < mx:FormItem? label ="Symbol" >
          ????????????
          < mx:TextInput?
          ????????????????
          id ="symbolTextInput" />
          ????????????
          < mx:Button?
          ????????????????
          label ="Get?Quote" ?
          ????????????????enabled
          ="{?stockQuote.isValid?}" ?
          ????????????????click
          ="getQuoteForSymbol();" />
          ????????
          </ mx:FormItem >
          ????????????????
          ????????
          < mx:FormItem? label ="Price?Quote" >
          ????????????
          < mx:Label? text ="{?standardEuroFormatter.format(?stockQuote.lastStockQuote?)?}" />
          ????????????
          < mx:Label? text ="{?stockQuote.statusMessage?}" />
          ????????
          </ mx:FormItem >
          ????????
          ????
          </ mx:Form > ????
          </ mx:Panel >


          此視圖中我們不需要使用ModelLocator,而是使用StockQuote作為參數(shù)傳入StockMarketPod.mxml
          引用視圖的代碼

          < mx:Script >
          ????
          <![CDATA[
          ????????import?com.adobe.cairngorm.samples.dashboard.model.ModelLocator;
          ????????import?com.adobe.cairngorm.samples.dashboard.model.StockQuote;
          ????????????????????????????????????
          ????????[Bindable]
          ????????private?var?model?:?ModelLocator?=?ModelLocator.getInstance();
          ????????[Bindable]
          ????????private?var?stockQuote?:?StockQuote?=?model.stockQuote;????
          ????
          ]]>
          </ mx:Script >
          ?
          < view:StockMarketPod?
          ????
          stockQuote ="{?stockQuote?}" ?
          ????title
          ="Stockmarket?Pod" />

          ?

          只傳遞需要的信息給視圖是一個比較好的做法,而盡量少使用ModelLocator這樣的全局變量,這樣也使用視圖重用性更高。



          主站蜘蛛池模板: 娄底市| 深水埗区| 集安市| 安宁市| 德钦县| 巍山| 泸定县| 白城市| 贵溪市| 孟连| 邳州市| 平原县| 安溪县| 铜陵市| 黄山市| 遂平县| 蒙阴县| 邵阳县| 辉县市| 东阿县| 余江县| 龙游县| 金溪县| 汽车| 陕西省| 九龙县| 开化县| 尚义县| 县级市| 花垣县| 高碑店市| 望城县| 天津市| 昌图县| 南城县| 蒙阴县| 应城市| 饶平县| 平远县| 息烽县| 乐业县|