首页 > AdvancED Flex 3中文翻译 > [Flex]AdvancED Flex 3中文翻译(二)

[Flex]AdvancED Flex 3中文翻译(二)

一个简单的例子

让我们来看一个简单的例子,以便你可以看到在实践中的MVC。我们的是model是2004年雅典奥运会奖牌排名前五名的国家。我们将根据这个model建立三个不同的view。一个view我们用表格的形式来表现,别外两个我们用柱形和条形的图表来表现。

在Flex,一个数据model能编译在树形的ActionScript对象中,使用MXML Model标签。我们的重点在MVC上,利用这一原理,把我们的model放在一个简单的XML文件中,我们结合Model标签来绑定源文件。接下来我们来考虑如何架构和设计model。Model标签的部分代码如下:

  1. <mx:Model source="/com/riarevolution/advancedflex3/examples/athens2004/model/medal_tally_top_5.xml" id="medalTally" />
  2. <!-- medal_tally_top_5.xml部分内容 -- >
  3. <!-- XML文件存储数据 -->
  4. <MedalTally>
  5.     <MedalWinner>
  6.         <ThreeLetterCode>USA</ThreeLetterCode>
  7.         <Name>United States</Name>
  8.         <GoldMedalCount>35</GoldMedalCount>
  9.         <SilverMedalCount>39</SilverMedalCount>
  10.         <BronzeMedalCount>29</BronzeMedalCount>
  11.     </MedalWinner>
  12.     <MedalWinner>
  13. </MedalTally>

这个model会用在三个不同的view中,放在三个独立的MXML中,利用Flex方便有效的数据绑定机制。将我们需要的值存在变量中,绑定的值要用{}括起来。真实的值存在变量中,这些值是从数据源中复制的属性,值是数据源的属性值({}括起来),是复制的目标属性。这样可以动态绑定变量的值,并保持数据源的值和使用地方的松散耦合。

{}机制,数据绑定允许:
■使用ActionScript表达式在{}中
■使用E4X表达式在{}中
■使用ActionScript 函数在{}中

任何一个ActionScript表达式的返回值可以作为数据绑定源放在{}中。可能一个单一的绑定属性或一个串联字符串包括绑定属性。绑定属性可能是一个绑定属性的运算或一个条件表达式。如前所述,它也可能是一个E4X表达或ActionScript函数。这里的重点是对MVC的理解,所以不再讨论目前的数据绑定, 第3章将分析了不同方法的数据绑定,并根据不同法的性能进行选择。

大多数的view都用一个dataProvider属性来定义数据模型源。这个属性只是接受用{}括起来的数据,所以在Flex中可以很简单的将一个model值绑定到多个view中。我们现在来用一个实际的例子来说明如何将一个model绑定到三个不同的view(一个使用DataGrid,另外两个使用Chars)中:

  1. <mx:Panel title="Athens 2004: Top 5 Medal Winners">
  2.     <mx:Panel id="dataGridPanel" title="Medal Tally: DataGrid Panel" height="35%" width="100%" >
  3.         <mx:DataGrid dataProvider="{medalTally.MedalWinner}" height="100%" width="100%">
  4.             <mx:columns>
  5.                 <mx:DataGridColumn dataField="ThreeLetterCode" headerText="Country Code" headerRenderer="mx.controls.Label" />
  6.                 <mx:DataGridColumn dataField="Name" headerText="Country Name" headerRenderer="mx.controls.Label" />
  7.                 <mx:DataGridColumn dataField="GoldMedalCount" headerText="Gold" headerRenderer="mx.controls.Label" />
  8.                 <mx:DataGridColumn dataField="SilverMedalCount" headerText="Silver" headerRenderer="mx.controls.Label" />
  9.                 <mx:DataGridColumn dataField="BronzeMedalCount" headerText="Bronze" headerRenderer="mx.controls.Label" />
  10.             </mx:columns>
  11.         </mx:DataGrid>
  12.     </mx:Panel>
  13.     <mx:Panel id="chartPanel" title="Medal Tally: Charts Panel" height="65%" width="100%" layout="horizontal" >
  14.         <mx:ColumnChart id="column" height="100%" width="45%" paddingLeft="5" paddingRight="5" showDataTips="true" dataProvider="{medalTally.MedalWinner}">
  15.             <mx:horizontalAxis>
  16.                 <mx:CategoryAxis categoryField="Name"/>
  17.             </mx:horizontalAxis>
  18.             <mx:series>
  19.                 <mx:ColumnSeries xField="Name" yField="GoldMedalCount" displayName="Gold"/>
  20.                 <mx:ColumnSeries xField="Name" yField="SilverMedalCount" displayName="Silver"/>
  21.                 <mx:ColumnSeries xField="Name" yField="BronzeMedalCount" displayName="Bronze"/>
  22.             </mx:series>
  23.         </mx:ColumnChart>
  24.  
  25.         <mx:Legend dataProvider="{column}"/>
  26.  
  27.         <mx:BarChart id="bar" height="100%" width="45%" paddingLeft="5" paddingRight="5" showDataTips="true" dataProvider="{medalTally.MedalWinner}">
  28.  
  29.                 <mx:verticalAxis>
  30.                         <mx:CategoryAxis categoryField="Name"/>
  31.                 </mx:verticalAxis>
  32.  
  33.                 <mx:series>
  34.                         <mx:BarSeries yField="Name" xField="GoldMedalCount" displayName="Gold"/>
  35.                         <mx:BarSeries yField="Name" xField="SilverMedalCount" displayName="Silver"/>
  36.                         <mx:BarSeries yField="Name" xField="BronzeMedalCount" displayName="Bronze"/>
  37.                 </mx:series>
  38.         </mx:BarChart>
  39.         <mx:Legend dataProvider="{bar}"/>
  40.     </mx:Panel>
  41. </mx:Panel>

这个简单的例子并不包括更新和修改model,所以这里并没有controller,下图(1-1)是运行的样式。

1-1
(1-1)

(1-1)这个应该程序用三个view来显示冠军统计数据,一个view是表格,另外两个是图表,它们使用相的model。

虽然这是一个比较基础的例子,但也是一个简单的MVC案例, 其中包括model和view的分离和松散耦合。为了让事情变得更有趣,我们让model更接近真实的情况。更确切地说,我们现在认为,该model可以存在于以下五个方面:
■本地存储的一个XML文件,并绑定到MXML模型标记,在我们的基础例子中已经用过。
■通过URL访问一个XML文件。
■放在数据库中通过应该层取得。
■由网络服务(如:webservice)取得。
■通过远程过程调用( RPC )从现有的不同语言(如JAVA、Python、PHP)的model,RPC可以调用远程对象。

下节继续!

(转载请注明出处,请勿使用商业用途!)

  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.