云自無心水自閑

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

          上次介紹了如何在業務邏輯中改變視圖,這次講解一種新方法。我們的股票市場顯示圖將擴展為多股票報價查詢器。我們將看到業務邏輯是怎么調整每個視圖的。而且我們還會接觸到無狀態命令是怎么使得事情變得簡單。
          第三次迭代--創建業務邏輯管理多視圖
          我們經常可以發現會有很多個類型一樣的視圖,其背后的功能也非常類似。每個視圖顯示一個Model對象。這些視圖可以在開始時從管理對象處請求一個Model對象。比如:我們的StockMarketDashboard.mxml可以進行這樣的添加:

          < view:StockMarketPod?
          ????
          quoteId ="quote1" ?
          ????title
          ="Stockmarket?first?pod" />
          < view:StockMarketPod?
          ????
          quoteId ="quote2" ?
          ????title
          ="Stockmarket?second?pod" />
          < view:StockMarketPod?
          ????
          quoteId ="quote3" ?
          ????title
          ="Stockmarket?third?pod" />
          < view:StockMarketPod?
          ????
          quoteId ="quote4" ?
          ????title
          ="Stockmarket?fourth?pod" />

          注意:視圖需要傳遞一些唯一的標識,我們將這些標識添加到StockQuote類。

          package ?org.nevis.cairngorm.samples.dashboard.model
          {
          ????
          public ? class ?StockQuote
          ????
          {
          ????????[Bindable]
          ????????
          public ?var?lastStockQuote?:?Number;
          ????????[Bindable]
          ????????
          public ?var?stockQuoteError?:?String;????????
          ????}

          }


          管理對象StockQuoteManager,在ModelLocator實例中初始化。但是StockQuoteManager會是一個怎樣的對象呢?
          通常我使用Hashmap來實現,其鍵值就是視圖中的唯一標識符。在構造函數中我們可以初始化這個Hashmap,Flex2中我們使用flash.utils.Dictionary

          public ?function?StockQuoteManager()?
          {
          ????stockQuotes?
          = ? new ?Dictionary();
          }


          getStockQuote方法返回一個stockQuote對象

          public ?function?getStockQuote(?quoteId?:?String?)?:?StockQuote
          {
          ????var?key?:?String?
          = ?quoteId;
          ????
          if (?stockQuotes[?key?]? == ? null ?)
          ????
          {
          ????????var?stockQuote?:?StockQuote?
          = ? new ?StockQuote();
          ????????stockQuotes[?key?]?
          = ?stockQuote;
          ????}

          ????
          return ?StockQuote(?stockQuotes[?key?]?);
          }


          StockMarketPod.mxml幾乎沒有什么改動。只需要將那個唯一的標識符發送給命令,因為命令需要從管理對象處取得StockQuote對象。所以GetStockQuoteEvent類多了一個quoteId屬性。
          在GetStockQuoteCommand中,需要將唯一標識符保存在一個成員變量中

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

          ????????
          public ?function?onResult(?event?:?ResultEvent? = ? null ?)?:? void
          {
          ????
          // simulate?a?result?from?service
          ????var?lastStockQuote?:?Number? = ?Math.random()? * ? 50 ? + ? 5 ;
          ????var?stockQuote?:?StockQuote?
          = ?model.stockQuoteManager.getStockQuote(?quoteId?);
          ????stockQuote.lastStockQuote?
          = ?lastStockQuote;
          ????stockQuote.stockQuoteError?
          = ? "" ;
          }

          ????????
          public ?function?onFault(?event?:?FaultEvent? = ? null ?)?:? void
          {
          ????var?stockQuote?:?StockQuote?
          = ?model.stockQuoteManager.getStockQuote(?quoteId?);
          ????stockQuote.lastStockQuote?
          = ?NaN;
          ????stockQuote.stockQuoteError?
          = ? " An?error?occured. " ;
          }

          注意一下,在上面的代碼中我們使用的是無狀態命令,在Cairngorm的說明中,無狀態命令是每次Cairngorm事件的響應都創建一個新的命令實例的方式。因此,在這種方式中我們可以放心地把變量存儲在成員變量中,而不用擔心被其他人改變。



          主站蜘蛛池模板: 泸西县| 沭阳县| 德保县| 开原市| 濮阳县| 利津县| 克什克腾旗| 中牟县| 金秀| 龙海市| 新龙县| 盐亭县| 奉新县| 麦盖提县| 凤冈县| 上林县| 信宜市| 如东县| 湖州市| 洛宁县| 依安县| 靖边县| 长春市| 渭源县| 宣城市| 鲁甸县| 怀仁县| 抚松县| 通榆县| 伊通| 沐川县| 长岭县| 广东省| 汉川市| 合川市| 邯郸县| 巴东县| 开化县| 嘉禾县| 巴马| 彭阳县|