<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 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

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

    ?

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

    ?

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

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

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

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


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

    增加格式化
    我們將股票報(bào)價(jià)以金額的方式進(jìn)行展示,在StockMarketPod.mxml中增加一個(gè)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" />

    ?

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



    主站蜘蛛池模板: 99精品视频在线视频免费观看| 亚洲熟妇无码一区二区三区导航| 亚洲午夜av影院| 国产片免费在线观看| 免费看片A级毛片免费看| 色妞WWW精品免费视频| 久久久久免费看黄A片APP| 在线视频免费观看爽爽爽| 亚洲一区二区三区免费观看| 曰批全过程免费视频播放网站| 最近中文字幕高清免费中文字幕mv| 30岁的女人韩剧免费观看| 最近免费中文字幕大全高清大全1| 99国产精品免费观看视频| 99re免费99re在线视频手机版| 99热在线免费播放| 台湾一级毛片永久免费| 成年女人毛片免费播放人| 成年人性生活免费视频| 国产一级一片免费播放i| 无码国产亚洲日韩国精品视频一区二区三区| 国产伦一区二区三区免费| 亚洲精品专区在线观看| 自拍偷自拍亚洲精品被多人伦好爽| 亚洲AV中文无码乱人伦下载| 久久久无码精品亚洲日韩按摩 | 114一级毛片免费| 好男人www免费高清视频在线| 日韩a在线观看免费观看| 少妇亚洲免费精品| 亚洲AV永久纯肉无码精品动漫| 久久久久亚洲Av无码专| 亚洲永久网址在线观看| 日韩a毛片免费观看| 3344在线看片免费| 在线观看免费人成视频色9| 免费国产a国产片高清| 永久亚洲成a人片777777| 亚洲色偷偷av男人的天堂| 亚洲av日韩综合一区二区三区| 久久不见久久见免费影院www日本 久久WWW免费人成—看片 |