发新话题
打印

[Flash教程] Macromedia Flex 教程: Flex入门教程

Macromedia Flex 教程: Flex入门教程

Macromedia Flex 教程: Flex入门 (1)8 P; H8 o1 P4 U  h+ K
创建第一个Flex应用程序3 e  J1 ~! p0 o. m8 m9 {( a
作者:Robert Crooks (Macromedia培训小组)* T5 {0 O" ~! o( b$ I% U5 s) c" B
翻译:MoonFun.qhwa# i' |3 `5 V+ z* N; s  R7 K6 t' h8 g4 ^
轉載請註明來自藍色理想( [* L; e* C' T" }9 ]) {( m1 x
在本教程中,你可以阅读到Flex的简单介绍,还可以利用MXML创建一个简单的分类购物车,从而学习到Macromedia Flex应用程序的基本构成。你将会学到:创建一个应用程序、添加一个布局的容器、添加控件、创建与控件关联的简单数据模型,以及利用ActionScript对事件进行处理。  D0 l8 d; b8 G7 U5 z) p
本文是Robert Crooks编写的四步Flex入门系列的第一部分,Robert Crooks现就职于Macromedia客户培训部门
/ M, Y) g$ _' b3 j0 s/ yFlex 入门 (2):创建一个Flex计算器" U0 G7 T9 Y  s( Z
Flex 入门 (3):使用容器. j3 x! B$ u! M5 ]+ j+ F7 N% L
Flex 入门 (4):使用数据模型
7 U: r- G& g1 Q' P; n点击这里下载整个系列教程: Flex入门系列(144KB)$ N, j+ H7 E4 Z+ Z
如果你需要更加详细的信息,Macromedia客户培训小组提供了为期两天的在线培训课程:《利用Flex开发丰富的互联网应用程序》,教你快速学习Flex应用程序开发。 让我们开始吧!
1 B4 v8 P6 _; z' `! ?# {6 m6 L如果你是一个XML新手,请记住下面的基本规则6 \/ d+ I/ x: a6 C0 |, b# ~  g0 }
如同所有的XML语言一样,在MXML中,标签和属性都是区分大小写的;
% f2 Q5 \/ x+ T( T+ Q1 n1 ~7 k& J所有的属性值必须用双引号(")或单引号(包含  s( ^2 p& `! i

. B5 }" {( j* U4 E( J9 T所有的标签必须是闭合的。没有子标签的标签可以以斜杠直接结束,而无需额外的结束标签:2 ]+ t3 V% G& _1 {+ U) k
<mx:Label text="Hello"></mx:Label>$ w  {) M* u% _+ `

6 u7 J0 ^% k4 l# y3 @1 Z<mx:Label text="Hello"/>+ E- a  ]  s+ J( @9 U% O  g
如果你是一个ActionScript新手,你可以发现它的语法和你熟悉的语言的语法很相近,比如JavaScript或者Java。请记住这些基本的规则:! K  p* F  I! n' p1 F
ActionScript是区分大小写的: Q4 _& n5 c! H2 T
语句必须以分号(;)结尾
! A' _. J- b4 l1 s本教程包含的内容:
+ i: ?, |4 b/ Q' H' v: ?! v7 W1. Flex简单介绍7 g9 T* e: B" y  b8 E
2. 如何使用Application (应用程序)标签
1 f4 a5 \$ n; p$ `- J+ O/ w! J5 y3. 如何使用Panel (面板)容器
8 q" M+ g( V) N6 C2 \* @4. 如何使用Label (标签)控件5. 如何使用Text (文本)控件6. 如何使用Button (按钮)控件7. 如何使用ComboBox (下拉列表)控件8. 如何创建一个数组对象7 y3 c2 ]! l/ e1 J# k) C
9. 如何绑定数据到控件对象
2 ^3 L/ J+ l8 ~9 J0 {10. 如何用ActionScript处理用户事件; t+ Q; O/ N) ?$ P8 n4 ?
准备条件+ `5 A0 \) ^" O  {. e( t. d( u0 C
完成本教程必须具备的软件和文件:+ C9 }2 N5 V1 z0 m
Macriomedia Flex$ t& z1 e1 Q8 @! m6 f) D% R
(可以在Flex支持的平台服务器上安装运行)试用版的Flex只有光盘供应,请从Macromedia销售处购买,售价$8.99. 试用版的相关信息,请访问: Flex常见问题
" ~# n) f9 T. t5 v; o+ L* U试用 购买
! Q/ X! [) S  h% a6 I& U; U2 @Dreamweaver MX 2004 或其他文本编辑器(例如记事本),用来编辑XML和ActionScript代码
  W8 _9 D6 V" e8 e, P" m* X' B试用 购买) |2 Y" R+ L, L1 T. X3 H/ v, i* U
准备知识:8 Z8 J& k+ v1 k7 |( O1 U: z9 ]
阅读Flex简介: J) z2 E3 d; R' P2 z* A
会浏览一个Flex应用程序
2 _$ Z2 Q/ K; R, C0 uFlex 简介 9 s7 J8 c/ \+ U- b* i4 d0 v: p
Macromedia Flex 是一个用来创建丰富信息的互联网应用程序的服务器组件。Flex内置的界面可以由Macromeida Flash播放器显示在客户端系统上。Flex的本质是:$ R, p/ z( U  V# e3 Y* @
  • 一个描述应用程序界面的XML语言 (MXML)
  • 一个ECMA规范的脚本语言(ActionScript),处理用户和系统的事件,构建复杂的数据模型
  • 一个类库
  • 运行时的即时服务
  • 一个由MXML文件生成SWF文件的编译器
MXML, p" C' y1 N) Y  m, x- K
MXML是一种描述Flex應用程序構造的XML1.0语言。每个MXML文件应该以一个XML声明开始:<?xml version="1.0"?>" A: s0 j8 S* G# K
和其他XML语言一样,MXML包含元素(标签)和属性,对大小写敏感。标签名称以大写字母开头,大小写混合,必须有对应的结束标签:/ t, P* a! m, p3 m" [3 a6 E5 z
<ComboBox></ComboBox>9 x6 D5 L" L) @4 M1 o
也可以这样结束对没有内容的标签:" m5 m- S( ^+ n, B; l9 N
<ComboBox/>9 ]* g0 ]& |" {4 T* a
属性以小写字母开头,大小写混合。属性必须包含在引号内。# @, s* f& n/ ^. Q) ~/ D
<ComboBox id="myCombo"/>& H; W/ f) z7 c- A+ l4 e
除了click或initialize之类的事件之外,所有的属性都被编译器作为文本字符串处理。如果需要绑定数据或者强迫编译器执行表达式,可以将变量的部分用花括号包起来:
8 _/ {8 Z" @" X, e; [<ComboBox dataProvider="{myArray}"/>) w0 J: C% R/ P# B& K4 e
大部分的属性都可以作为子标签:
% y; t7 _' k# y8 e<ComboBox dataProvider="{myArray}"/>- U" Q( X* U. `% d( Q) p
等效于:
% _2 ~$ H* F+ J3 I6 b<ComboBox> <dataProvider>{myArray}</dataProvider> </ComboBox>* M/ L; \% y; K6 W; f# y
描述应用程序的MXML文件必须有一个位于其他元素之外的Application元素:
9 P" F3 y: O% x* C- k; J; H<?xml version="1.0"?>  
  k" t% S2 N+ a# M4 t( J<mx:Application xmlns:mx="http://www.macromedia.com/2003/mxml">
9 \0 z$ T* ?2 a7 N8 D9 L  [other elements...]  
& ^9 p8 m4 r$ V2 I1 ~9 h</mx:Application>: c1 }. m, G. |' R/ I
注意xmlns属性,它声明了XML的命名空间。命名空间可以让你在单个文档中使用多重XML语言而避免混淆不同语言中相同的元素名称。这里的":mx"就是一个在特定命名空间中使用的前缀。9 Z" F! D! s6 w+ O! [- x
注意:这里定义的命名空间是标准的MXML类库,请将它包含在每个MXML文件中。2 T* z) n* S# T2 b9 e2 x
可以将声明放在任何MXML标签中;声明对该标签嵌套的所有标签有效。本系列教程中都以mx作为MXML类库的前缀。
, j! @/ m# u) X如需更多信息,请参阅 Flex语言参考
8 ~4 |7 x/ N, E& {9 EActionScript
2 ?" [( _6 Q1 P, j: ]ActionScript是一种类似JavaScript和其他ECMA规范的面向对象的脚本语言。如果你使用过JavaScript或Java/C#等其他面向对象的语言,你可以发现它们的语法很相似。你可以在MXML文件中嵌入ActionScript代码,也可以从独立的外部文件导入代码。
% s8 F  t& x. n5 u, `/ A' l完整的ActionScript参考: Action 语言参考/ J- X; N; p2 M$ ^

2 E0 `2 @' |+ ]/ aMXML类库/ U0 Y+ x) T7 ], D
Flex既包含控制和容器等可见的组件,也包括了远程服务对象和数据模型等的不可见组件。你可以在后面的介绍中得到详细的信息。
4 v4 m! P" D' F# t# j运行时服务8 ]5 j/ V9 w+ z4 Z& x
Flex提供了多项运行时服务,如:历史控制和远程服务连接对象。以开发的角度看,这些服务都是对类库的调用。
2 B+ E3 s8 a; ], b+ @4 Z编译器9 h) ]8 d& f! [( g
Flex编译器会在收到一个浏览器访问MXML文件的请求后,自动编译生成相应的SWF文件。该SWF文件将被缓存,直到你修改了源MXML文件。
- A% ~. z$ ~. [9 l# a# Y# z创建应用程序
8 l" C* ^6 S  }# n9 B在这个简单的购物车中,我们显示一个咖啡品牌的列表(类似于HTML的select)。使用数据绑定功能在下面显示当前选择的品牌的说明,还有一个添加到购物车的按钮,当按钮被按下后,该品牌的咖啡便会被添加到购物列表中。. n6 p6 i! C! d& Z5 ~5 G& }

图1. 教程创建的Flex应用程序

这个教程的目的是为了学习使用:. L3 D  {( P% W6 {+ j9 P9 f
Application (应用程序)类
4 a5 `& g6 Z+ H9 ?Panel (面板)容器
. \; B- p9 e. v4 }5 gScript (脚本)元素
! b1 }) j3 X# d- ~7 NArray (数组)元素( V5 F+ M7 `/ o& l( K
Object (对象)元素: I) |6 D6 ~: a# B: b! [2 B1 }
Label (标签)元素
- ^/ k% E6 y9 g# ]1 eText (文本框)元素- E# E4 _# s) o" g4 A7 O
Button (按钮)控件0 o/ E+ H" Q/ \( g
ComboBox (下拉列表)控件$ r* C- Z4 _; K$ ~( c4 @
List (列表)控件
4 L" V; ]4 C) _! z) D) g  S" I一个ActionScript函数4 u; t+ y3 B  G5 [! R0 c, T
! K7 H6 {7 K- }( h: p& g3 h
创建Application(应用程序)对象
" U! o, K! U) c3 L( d% b任何一个Flex程序都是以XML声明开始和Application标记的。Application标签包含一个MX类库命名空间的声明:xmlns:mx="http://www.macromedia.com/2003/mxml" 。引用该类库的所有标签必须以mx作为前缀。
0 Y* V, x% w+ d6 k) \2 j2 i1. 创建一个新文件 ,然后保存为 firstapp.mxml,位于flex_tutorials目录下+ H* j7 |% q; t# s6 S. j  m
2. 在文件的开始处,插入XML声明:9 z$ P: u9 n- e* t4 N8 G
<?xml version="1.0"?>$ j' J  R) d* J2 t* i
3. 在XML声明后,添加带命名空间的Application标签:0 E9 N% P# I3 N( t; k3 X
<mx:Application xmlns:mx="http://www.macromedia.com/2003/mxml">; I& `& T6 U. N) K8 n
</mx:Application>
7 x9 {" [: L$ e5 x$ s) D; L应用程序布局:添加一个面板
) W. S' L3 N" A. T/ p通常你可以将Flex应用程序中可见的组件放置于容器中,容器提供了绑定文本、控件、图像和其他媒体类型的元素。在这里,你可以使用称为“面板”(Panel)的容器,它可以提供大部分应用程序需要的全部外壳。你还可以使用面板的title(标题)属性,修改面板上方自动包含着的标题榄的文字。9 x" N& t4 w$ ~1 B; Q: j. D
4. 在Application标签内部,添加一个Panel标签,title属性为"my First Flex App"
/ D4 |; P% x+ N<mx:Panel title="My First Flex App">
2 n- Z' K# W; L, @7 A& ?- ^</mx:Panel>
. r2 ?- y( K% X, q5 h1 l添加一个显示标题的Label元素
7 }) e( T6 J& o9 H  vLabel元素可以用来显示单行文本。它有一些属性,这里用到的是text(文本)属性,定义Label显示的内容。8 u2 j8 h' z4 c# x
5. 在Panel标签内,插入一个带有文本属性的Label标签,如下:<mx:Label text="Coffee Blends"/>
4 ?4 z& P: h- T% S6. 保存文件,预览一下程序' _/ w8 @8 R( T( T. i8 q5 |: {. t9 M& I
添加一个定义咖啡品牌的数组对象! J# z! _' w; q7 }& D
本程序的数据模型是一个简单的数组(内容是一系列的对象),你可以直接在程序中用Array和Object元素创建。这里每个数组单元对象都有两个属性:label和data,你可以将这两个属性写成对象的子标签。用这两个属性名称是为了提供给ComboBox和List这样的控件元素使用,稍后我们会介绍。
! s( b: }$ d' s2 `6 E. L% o$ j这些控件元素可以使用更加复杂的数据对象,但是既然现在是手工创建数据模型,我们就使用简单的形式。通常的语法是:
) m6 M8 V% A9 f3 Z' f! E<mx:Array id="identifier">
5 n0 [7 x) i4 ^+ B% T3 b: f  <mx:Object>
( i/ B, \- o7 q) c  }      <label>literal string</label>9 O* V! }, t  d8 @/ G
      <data>another literal string</data>2 Z8 M2 w+ k- ?: ~+ n& J3 ?
  </mx:Object>
' }  h$ p+ ^; m. Y2 T& }  K</mx:Array>
4 i& \4 ]. n5 p9 ^, Q) E留意这里的ID属性。ID几乎是所有Flex元素都具备的属性,它将元素“贴”上标志以区分其他元素。如果你要在数据绑定或ActionScript中使用这个元素,最好给它指定一个ID。4 f" A  J+ w$ m0 X7 l
不可见元素可以由你随意摆放,但是把他们放到程序的首部--即可见元素的前面--是一个好习惯。0 v6 s7 w0 v7 ]% s+ g, }6 L
<mx:Array id="coffeeArray">
" N% v( y- j/ M <mx:Object>
; @. h3 g" h) C4 r  <label>Red Sea</label>0 k3 k/ m6 y2 o5 }- J# G9 q
  <data>Smooth and fragrant</data>
# w4 p7 v& |% V* Q: ^+ A) { </mx:Object>% ]' L# g0 S0 Q6 R% i- t
<mx:Object>6 _/ \  i: T) Z/ A6 g1 G# D
  <label>Andes</label>
, o2 j  T. {$ ]6 c( Q  <data>Rich and pungent</data>& t& V7 V. N: r  o" u5 G9 A2 Y2 l
</mx:Object>
; L/ n8 J, n# p3 I <mx:Object>" j7 l2 s# R- e/ n8 `2 y  X
<label>Blue Mountain</label>) D0 N5 u1 {; _( J2 y4 x6 x
<data>Delicate and refined</data>2 k: v0 }- [5 D/ `6 B' i2 I
</mx:Object>
1 Z' }  ], E! A/ E  C9 p</mx:Array>  {! A( u$ g2 Y$ ~/ d
$ g% F: s9 _0 T" _2 k1 H! l
添加一个显示咖啡品牌的ComboBox4 s' h4 N, x! V. }( s
Flex的ComboBox类似于HTML的select功能,而且更加强大。需显示的数组由dataProvider属性指定。你可以在dataProvider标签中直接创建数组,但是更为常用的方法是在别处创建或导入一个数组,然后在dataProvider处指定:
" i2 [* C$ F1 d* O<mx:ComboBox id="myCombo" dataProvider="{myArray}"/>
; G" {! N" a' ?; L6 X这里的大括号告诉编译器:里面是一个变量或者代求算的变量,而不是字符串。
6 Q* a+ |+ }4 g如果对象包含label和data属性,他们会自动按显示数据(label)和关联数据(data)区分,data可以是简单的值,也可以是复杂的类型(如对象)。如果对象既没有label属性也没有data属性,那么整个对象将作为data属性,而label属性则为由ComboBox的labelField属性指定的对象属性。例如ComboBox的labelField值为"name",那么label的值就为对象的name属性。* Q1 o. D4 x$ C" s* v# r2 n
8. 在Label之后添加一个ComboBox,id取为coffeeComb,使用dataProvider属性将CombBox绑定到上一步创建的coffeeArray数组:0 l  w- s" \* c6 l4 Z+ p* i
<mx:ComboBox id="coffeeCombo" dataProvider="{coffeeArray}"/>9 E, m: H& b* U. a" W
添加一个显示说明的Text(文本)控件; a7 V6 o4 @3 _6 ^! g
Text控件与Label相似,不同的是它可以显示多行数据。这里我们用它来显示ComboBox中选中的咖啡品牌的说明。这里要用到ComboBox中选择的项目的data属性。  c# z8 a0 ?: m5 N: e$ \4 x8 W1 \
9. 在ComboBox之后,添加一个带有text属性的文本控件,将text属性设置为“Description:”然后加上一个到ComboBox选择项目的data属性的绑定:+ E* o+ [! B' r- E
<mx:Text text="Description: {coffeeCombo.selectedItem.data}"/>
- M$ q9 t5 G# V: a& I1 o: Z: I
& Z0 Z+ S% e3 B/ q/ B3 F; P# W添加一个增加咖啡品牌到购物栏的按钮. q- D% E+ Y- [1 j$ d+ n
Button控件很简单。它有一个label的属性来设置显示的文字,还有一个click事件,用来指定鼠标点击事件的处理动作。3 b: K# x# a) Y! W9 {
在这里,我们添加一个按钮,通过调用一个addToCart函数,把ComboBox中选择的项目添加到购物栏中。我们将在后面创建这个函数。. H3 n9 _6 r2 b) p
10. 添加一个显示“Add to Cart”的按钮,被点击后调用addToCart函数:
6 y; P6 ^- m* z  K: ?8 n/ {<mx:Button label="Add to Cart" click="addToCart()"/>
( {5 d" c  l: T' X) w给购物车添加一个List(列表)控件2 V! {1 N$ f3 }0 i( V, f1 h
List控件和ComboBox唯一的区别是它能同时显示和选择多条项目。这里用的List不需要指定dataProvider属性了,因为它在用户添加数据前是空的。$ K3 `6 N, R* G8 c; v+ o
11. 在按钮之后,添加一个List控件,id取为cart:# f. {! u. [8 _# ~. d
<mx:List id="cart"/># J/ L7 r" _+ B: D
添加一段处理按钮点击事件的脚本
# o  J+ y2 V% s- K1 ^教程的最后一步是添加一段ActionScript脚本,用来处理按钮的点击事件。在这个简单的应用程序中,我们在Script标签中添加脚本。; A2 y  T* _( S6 B  ^' J- @
Script标签中的ActionScript代码将被包含在 <![CDATA[  ]]> 里面,这个标志里面的内容不被XML解析器解析。这个是标准的XML用法,在这里是为了保护ActionScript的一些可能会被XML解析器误处理的一些字符(如<等),实际上这样不仅保护了这些字符,也省去了XML解析器解析ActionScript内容。& S' o# J2 _% O# C& ]
这里用到的ActionScript语法很简单,函数的通常语法是:
* _# }; r5 Q1 `9 ?% d- rfunction 函数名(参数1:数据类型...):返回数据类型
- u0 o. M' C7 Z. N5 l6 Q+ J; P' U. d{
4 f% i  R7 g0 O* D4 U; @0 }& _ [ActionScript 语句]
) `# ]9 U  n; h( T" ?& q}+ O! k, r% P4 Z7 j  H; v% T7 T; s% r
在addToCart函数中,使用List类的addItem方法添加项目。该方法需要有label参数和data参数,这些参数正好是ComboBox中选中的项目的label属性和data属性。+ |- `. ~! d5 x& W7 m* B8 k
12. 在Array标签之后,插入一个带有CDATA包装的Script标签:
; j, ]9 l, V: X7 T8 C' V2 ~" d" ?<mx:Script>7 i* }, c  X1 L* y/ k
  <![CDATA[]]>
* u' q% K0 `. Y</mx:Script>
$ ?, w0 N* \7 z; u/ V9 M8 z6 \13. 在CDATA里面,添加一个名为addToCart不返回任何值的函数:
0 P9 q! T+ F! N, ?8 ~& H$ p0 Ifunction addToCart():Void) y4 J& I0 C  R! H! Q0 J
{
. {( b2 z6 p: S1 C}
% Q+ D5 c1 ^( y$ {0 v$ P
) a7 W' e# ]# w0 A5 N14. 在函数体内部,使用List类的addItem方法将ComboBox中所选项目label属性和data属性添加到List上。
4 P  I) @, f8 @; Xcart.addItem(coffeeCombo.selectedItem.label,coffeeCombo.selectedItem.data);( m$ t; v! ?6 H/ X/ W
15. 保存文件,在浏览器中预览应用程序 (查看浏览MXML文件的方法见第一页)% j  A! p( K9 F, e3 B
2 X: l9 {# ^4 X7 k, ^  k% ^7 [
firstapp.mxml完整的代码:. r' @. F7 q6 E
<?xml version="1.0"?>" K- x3 l/ u, a0 C/ e
<mx:Application xmlns:mx="http://www.macromedia.com/2003/mxml" >6 Y" k! p. ~# t7 N$ T
<!-- data model -->* y) }1 C! e+ _' X4 z# m
<mx:Array id="coffeeArray">
6 @$ ?) n& c# u$ ^) k" B9 l  <mx:Object>
6 k. R# y; x, X+ o7 m, x; m   <label>Red Sea</label>* R- R4 j3 l1 E- J8 S
   <data>Smooth and fragrant</data>
+ q8 F/ Z+ {+ b  </mx:Object>( s8 u3 ~3 ^, H- t, r4 h
  <mx:Object>8 E5 D  M1 t- D# L  d" j
   <label>Andes</label>" F4 p" C. B+ E% K
   <data>Rich and pungent</data>
! s: W( P/ F7 s% Q  |9 i/ t+ c5 i0 k  </mx:Object>
# m$ b& u7 @8 @5 H( H4 f  <mx:Object>* f, b. j  T; j/ a  I2 D) Z
   <label>Blue Mountain</label>
/ Y+ b3 a" k, d   <data>Delicate and refined</data>- [' L# i4 c, E( ~/ ^/ i7 @
  </mx:Object>
! O. h3 l) r, ]! l# \5 h5 U2 t' E </mx:Array>: Y! d" `3 @: m
<mx:Script>
! y6 j& {8 a9 G, z& y  <![CDATA[
( n! P7 V: C( X! @. O   function addToCart():Void
4 P( Q5 C3 n; r# }% i6 m   {
: J9 l+ O0 j8 i    cart.addItem(coffeeCombo.selectedItem.label,coffeeCombo.selectedItem.data);
& P" M6 X  u4 D! t& s9 Y2 ]7 D   }
9 q0 C* |% p) i) k  ]]>2 o* x" B4 z+ J: M* \) P+ {  g
</mx:Script>. }) E; S6 }& O, M3 N) O: f
<!-- view -->; G2 O9 Q0 ]8 C8 j; G$ C
<mx:Panel title="My First Flex App">6 b9 r2 C, i, E2 Z% r! [/ Z
  <mx:Label text="Coffee Blends"/>
' }" y; W6 G+ m$ a4 p  <mx:ComboBox id="coffeeCombo" dataProvider="{coffeeArray}"/>( b& ?7 F% S' `! G! `; d
  <mx:Text text="Description: {coffeeCombo.selectedItem.data}"/>5 N) ?: c: g; l2 z/ B0 c# o
  <mx:Button label="Add to Cart" click="addToCart()"/>( T2 J. L4 P9 u# o: Y
  <mx:List id="cart"/>
3 h4 L' r  I1 n: j </mx:Panel>
$ r6 ~$ L+ |2 Q: Z0 T. ^! U</mx:Application>' V. \/ m; B/ ]& c* G
! ?& A: i  A& n; v
进一步学习- w1 a/ e5 U- P; l) l8 N
在这个简单的例子中,我们学习了Flex的一些核心元素:容器、控件、数据模型、数据绑定和事件处理。你可以继续看本系列教程:3 N( j4 @$ @% O8 q# `9 d
Flex 入门 (2):创建一个Flex计算器
& X& j. K1 [! b% E: r8 U, rFlex 入门 (3):使用容器4 Z5 P" Z, `8 E. z
Flex 入门 (4):使用数据模型) E+ S; _2 l) {" L8 J5 G
你也可以下載整个教程:Flex入门(1-4)
草根,不是为了草根而草根;
草根,是手段,不是目的,脱颖而出才是目的!

草根站长论坛一定是你脱颖而出的必选的平台!
请帮助宣传/支持草根站长网.草根站长网是一个需要理解的地方,适宜长期居住!

TOP

发新话题