云自無心水自閑

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

          Cairngorm示例--業務邏輯如何管理視圖(II)

          Posted on 2006-12-28 00:50 云自無心水自閑 閱讀(714) 評論(0)  編輯  收藏 所屬分類: Flex 、Cairngorm 、Flex2

          上次介紹了如何在業務邏輯中改變視圖,這次講解一種新方法。我們的股票市場顯示圖將擴展為多股票報價查詢器。我們將看到業務邏輯是怎么調整每個視圖的。而且我們還會接觸到無狀態命令是怎么使得事情變得簡單。
          第三次迭代--創建業務邏輯管理多視圖
          我們經??梢园l現會有很多個類型一樣的視圖,其背后的功能也非常類似。每個視圖顯示一個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事件的響應都創建一個新的命令實例的方式。因此,在這種方式中我們可以放心地把變量存儲在成員變量中,而不用擔心被其他人改變。



          主站蜘蛛池模板: 剑川县| 吕梁市| 丰城市| 宣威市| 蓬溪县| 华坪县| 竹山县| 横山县| 三江| 台山市| 巩留县| 三门峡市| 呼伦贝尔市| 宁晋县| 安陆市| 惠东县| 黔西| 游戏| 镇宁| 惠来县| 武宣县| 永川市| 郯城县| 枝江市| 新建县| 南雄市| 鲁山县| 宜兰县| 柳河县| 赫章县| 高邮市| 金阳县| 韶关市| 赤城县| 阆中市| 西青区| 金湖县| 香格里拉县| 揭西县| 高台县| 鄂伦春自治旗|