<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    云自無心水自閑

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

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

    ?

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

    ?

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

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

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

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


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

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

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


    現在看一下完整的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作為參數傳入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這樣的全局變量,這樣也使用視圖重用性更高。



    主站蜘蛛池模板: 国产无遮挡色视频免费视频| 中文字幕亚洲一区| 国产大片51精品免费观看| 亚洲国产精品成人综合久久久| 抽搐一进一出gif免费视频| 亚洲视频免费观看| 免费国产精品视频| 91精品国产免费网站| 亚洲欧美乱色情图片| 无码高潮少妇毛多水多水免费| 亚洲国产人成在线观看| 国产成人精品久久亚洲高清不卡 | 香蕉97碰碰视频免费| 波多野结衣免费视频观看| 久久精品无码专区免费东京热| 亚洲高清在线观看| 免费国产精品视频| 日韩免费a级毛片无码a∨| 亚洲性无码一区二区三区| 亚洲AV永久无码区成人网站| 国产网站在线免费观看| 91免费在线播放| 97在线免费视频| 日韩在线视频线视频免费网站| 爱情岛论坛网亚洲品质自拍| 毛片网站免费在线观看| 久久精品乱子伦免费| a在线视频免费观看在线视频三区| 好看的电影网站亚洲一区| 波多野结衣免费视频观看| 无码人妻一区二区三区免费| 暖暖日本免费中文字幕| 午夜免费国产体验区免费的| 亚洲精品日韩一区二区小说| 亚洲日韩国产精品无码av| 亚洲AV无码不卡在线播放| 亚洲人成人一区二区三区| 日本免费网站视频www区| 青青草原1769久久免费播放| 亚洲最大的黄色网| 亚洲经典在线观看|