设计松耦合的Flex组件 디자인을 느슨하게 플렉스의 구성 요소를 결합

又看到一篇不错的Flex初级教程,翻译了过来。 또한 좋은 플렉스 기본 가이드, 번역합니다. 翻译已经经过作者Marco Casario的同意,原文版权归原作者所有,译文版权归Dreamer所有。 이후에 저자가 번역되어있습니다 마르코 casario의 동의 원래 저자의 원래 텍스트를 소유, 몽상 : 소유의 모든합니다. 此文未经同意,谢绝转载。 이 문서가 동의를하지 않고, 재판을 거부합니다.

英文原文:http://mxdj.sys-con.com/read/276919_1.htm 영어 텍스트 : http://mxdj.sys-con.com/read/276919_1.htm
作者: Marco Casario 저자 : 마르코 casario

译者:Dreamer 역자 : 꿈꾸는

设计松耦合的Flex组件 디자인을 느슨하게 플렉스의 구성 요소를 결합

Flex应用程序可能有复杂的结构但它们通常都是由多个MXML,Actionscript 以及CSS文件组成。 플렉스 응용 프로그램은이 복잡한 구조를하지만 그들에 의해 개수는 보통 mxml, actionscript 및 전투 근무 지원 문서를 조성합니다.

在单个文件里编写整个程序不是一个最佳实践。 전체 프로세스를 단일 문서를 준비하는 모범 사례가있습니다. 那样会使代码难以维护和重用,而且程序没有被架构成逻辑上的各个部分。 이 코드는 어려울으로 재사 용할을 유지하고, 그리고 프로 시저의 논리 구조에되지 않은 여러 부분합니다.

Flex允许开发者将一个工程分成外部的模块,创建分离的MXML文件并且单独维护它们。 프로젝트를 통해 플렉스 개발자가 나뉘어된다 외장형 모듈을 분리하고 보존하는 별도의 문서를 만드는 그들을 mxml합니다. 将Flex程序分离成各个逻辑模块有很多好处。 플렉스 프로그램은 서로 다른 논리 모듈은 많은 장점로 구분됩니다. 它允许开发小组独立地开发和调试单个模块,模块中的错误和功能可以被独立出来。 그것의 개발을 통해 독립적인 그룹을 하나의 모듈을 개발 및 디버깅에 독립적인 실수를 모듈과 기능을 수있습니다. 这使得代码变得容易维护,也提高了代码在多个应用程序间的重用性。 이것은 그것을 유지하기 쉬운 코드,이 코드도 증가 사이의 수많은 응용 프로그램을 다시 사용합니다.

每个MXML文件是一个MXML组件,但是只有主MXML程序可以加载外部组件。 mxml 문서는 mxml 각각의 구성 요소, 단지 외부 구성 요소의 주요 mxml 절차를 읽어 들일 수있습니다. 事实上一个应用程序中只能有一个Application 标签,其它所有都是MXML组件。 실제로 응용 프로그램의 응용 프로그램 상표는 하나만있을 수있습니다, 다른 모든 구성 요소는 mxml합니다.

为了设计一个MXML组件,需要创建一个MXML文件。 을 위해 디자인을 mxml 구성 요소, mxml 문서를 만들 필요합니다. 这个文件的根标签不是Application而是一个组件标签(比如VBox,Panel,Canvas,Button,DataGrid等等),而且根标签中需要声明命名空间http://www. adobe .com/2006/mxml 。 하지만이 문서의 구성 요소는 응용 프로그램의 루트 레이블을 레이블 (예 : vbox, 패널, 캔버스, 버튼, 데이터 등), 그리고 뿌리를 레이블 이름을 지정 공간이 필요 성명 @합니다. adobe .com/2006/mxml합니다.

下面的代码展示了一个简单的叫做custDataGrid.mxml 的MXML组件,它由一个用来存储数据的DataGrid组成。 아래의 간단한 코드를 호출의 표시를 custdatagrid.mxml the mxml 구성 요소를 사용하여 데이터 저장소의 데이터를 구성 요소 중 하나를합니다.

<?xml version=&#34;1.0&#34; encoding=&#34;utf-8&#34;?> <? xml 버전 = "1.0"인코딩 = "utf - 8"?>
<mx:VBox xmlns:mx=&#34;http://www.adobe.com/2006/mxml&#34;> <mx:vbox xmlns:mx="http://www.adobe.com/2006/mxml">

<mx:DataGrid id=&#34;myDG&#34; > <mx:datagrid id="mydg">
<mx:columns>
<mx:DataGridColumn headerText=&#34;Posts&#34; dataField=&#34;title&#34; /> <mx:datagridcolumn headertext="posts" datafield="title" />
<mx:DataGridColumn headerText=&#34;Date&#34; dataField=&#34;pubDate&#34; width=&#34;100&#34; /> <mx:datagridcolumn headertext="date" datafield="pubdate" width="100" />
</mx:columns> </ mx : 컬럼>
</mx:DataGrid> </ mx : 데이터>

</mx:VBox> </ mx : vbox>

根标签是一个简单的VBox组件并且其中声明了xmlns:mx=&#34;http://www.adobe.com/2006/mxml&#34;。 gen - 라벨은 간단한 문장의 구성 요소와 vbox xmlns : mx = "http://www.adobe.com/2006/mxml"합니다. 一旦创建了外部模块,主程序就可以像下面一样调用这个MXML组件: 외장형 모듈을 작성하면, 메인 프로그램은 아래와 같은 이름이 mxml 구성 요소 :

<?xml version=&#34;1.0&#34; encoding=&#34;utf-8&#34;?> <? xml 버전 = "1.0"인코딩 = "utf - 8"?>
<mx:Application xmlns:mx=&#34;http://www.adobe.com/2006/mxml&#34; layout=&#34;absolute&#34; xmlns:cust=&#34;comp.*&#34; > <mx : 응용 프로그램 xmlns : mx = "http://www.adobe.com/2006/mxml"레이아웃 = "절대적인"xmlns : 고객 = "comp .* & # 34;>
<mx:Panel title=&#34;Comtaste&#39;s Blog Reader&#34;> <mx:panel title="comtaste's 블로그 reader">

<cust: custDataGrid width=&#34;80%&#34; /> <cust: custdatagrid width="80%" />

</mx:Panel> </ mx : 패널>

</mx:Application> </ mx : 응용 프로그램>

主程序添加了一个新的XML命名空间并使用一个包名来表示在一个文件夹中定义的所有组件: 메인 프로그램에 추가하는 새로운 xml 네임 스페이스와이 이름을 사용하는 패키지의 폴더에있는 모든 구성 요소의 정의 :

<mx:Application xmlns:mx=&#34;http://www.adobe.com/2006/mxml&#34; layout=&#34;absolute&#34; xmlns:cust=&#34;comp.*&#34; > <mx : 응용 프로그램 xmlns : mx = "http://www.adobe.com/2006/mxml"레이아웃 = "절대적인"xmlns : 고객 = "comp .* & # 34;>

“cust”命名空间指向”comp”文件夹中的MXML组件,实际上如果是最佳实践所有的组件都应当被保存在一个子目录下。 "고객"명명 공간에 "comp"폴더에있는 mxml 구성 요소, 모범 사례는 사실 경우에는 서브 디렉토리에 저장되어있는 모든 구성 요소를해야합니다.

使用组件和使用其它MXML标签一样,唯一不同的是不再使用”mx”前缀而是使用自定义前缀: 그리고 사용의 다른 구성 요소의 사용을 mxml 태그, 유일한 차이점은 더 이상 사용 "mx"접두사하지만 사용하는 사용자 정의 접두사 :

<cust: custDataGrid width=&#34;80%&#34; /> <cust: custdatagrid width="80%" />

注意MXML标签的名字对应着这个组件的文件名。 참고 사항에 해당하는 mxml 탭의 파일 이름의 구성 요소의 이름을합니다.

紧耦合组件与松耦合组件 느슨하게 결합된 구성 요소를 구성 요소와 긴밀하게 결합

为了使组件在程序中可以配置和重用,你可能会想要创建可以接受属性,创建方法以及分派事件的MXML组件。 이 절차를 진행을 위해 구성 요소를 구성하고 재사 용할 수있습니다 수있습니다 허용되는 속성을 만들려, 그리고이 사건을 창조 mxml 구성 요소를 배포하는 방법에 관한 것. 为了做到这样,组件必须不依赖于特定的程序(紧耦合),包括它们的变量名或标签实例的名字。 이를 위해서는 구체적인 절차의 구성 요소에 의존해서는 안됩니다 (꽉 커플링)을 포함한 그들의 예입의 이름을 매개 변수 이름이나 레이블을합니다. 紧耦合情况下如果程序或者组件的代码改变了,相应的代码就不能再工作,我们必须修改紧耦合的组件来相应这些变化。 상황이나 구성 요소를 결합 절차를 꽉의 코드가 변경하면, 해당 코드는 더 이상 작동하지 않습니다, 우리 개정을 꽉 필요가 이러한 변경 사항에 해당하는 구성 요소의 결합합니다.

一种更清晰也更好的方式是开发松耦合的组件,它可以分派传播返回数据给程序的事件并且包含一些属性使得可以从程序传送信息给它。 명확하고 더 나은 방법은 느슨하게 결합된 구성 요소를 개발, 보급을 지정할 수로 복귀하려면 데이터를 처리하는 이벤트와 많은 특성을 포함하는 과정에서 메시지를 보낼 수있다 그것합니다.

这种方式可以让你像创建“黑盒子”一样创建MXML组件,并且有以下好处: 이것을 만들 수있습니다으로 "블랙 박스"처럼 mxml 구성 요소를, 그리고는 다음과 같은 장점 :

•它们容易重用和维护•除了内部的组件它们不了解其它的东西•它们不依赖于一个变量名和标签实例的名字 그들은 재사용 및 유지 관리를 쉽게 • • 이외에 다른 것들의 내부 구성 요소의 사람들은 이해를 못 • 변수 이름과 그들에 의존하지의 예입니다 레이블의 이름을

如我们所说的那样,为了创建一个松耦合的组件我们需要属性来存储信息,需要一个事件模型来分派包含有返回数据的事件。 로 우리가 말했다, 느슨하게 결합된 구성 요소를 만들기 위해 정보를 저장해야 속성, 이벤트 모델의 필요성을 할당하는 이벤트에 데이터를 다시 포함합니다.

属性经常在ActionScript中定义(尽管你可以在MXML中定义它们)并且放在一个<mx:Script>块中: 에 정의된 속성을 자주 actionscript (그러나 그들을 정의할 수있습니다 mxml) 및 스크립트를 <mx: 블록 :

<mx:Script> <mx:script>
<![CDATA[ <! [cdata [
import mx.collections.ArrayCollection; 수입 mx.collections.arraycollection;

[Bindable] [바인딩]
public var lista:ArrayCollection; 공공 변수 목록 : arraycollection;
]]> ] ">
</mx:Script> </ mx : 스크립트>

定义MXML组件的方法也是一样: mxml 구성 요소를 정의하는 방법은 동일합니다 :

<mx:Script> <mx:script>
<![CDATA[ <! [cdata [
import mx.collections.ArrayCollection; 수입 mx.collections.arraycollection;

[Bindable] [바인딩]
public var lista:ArrayCollection; 공공 변수 목록 : arraycollection;

public function justWrite():String 공공 기능을 justwrite () : 문자열
{ (
return &#34;This is a method of the component&#34;; 반환 "이것은 구성 요소를하는 방법에 관한 것";
} )
]]> ] ">
</mx:Script> </ mx : 스크립트>

在下面的例子中,组件定义了一个作为DataGrid的dataProvider的属性和一个返回字符串的方法。 아래 예제에서 dataProvider라는의 구성 요소에 대한 정의는 데이터의 속성과 문자열 방법으로 반환합니다. 下面是custDataGrid.mxml 文件的全部代码: 아래는 문서의 전체 custdatagrid.mxml 코드 :

<?xml version=&#34;1.0&#34; encoding=&#34;utf-8&#34;?> <? xml 버전 = "1.0"인코딩 = "utf - 8"?>
<mx:VBox xmlns:mx=&#34;http://www.adobe.com/2006/mxml&#34;> <mx:vbox xmlns:mx="http://www.adobe.com/2006/mxml">

<mx:Script> <mx:script>
<![CDATA[ <! [cdata [
import mx.collections.ArrayCollection; 수입 mx.collections.arraycollection;

[Bindable] [바인딩]
public var lista:ArrayCollection; 공공 변수 목록 : arraycollection;

public function justWrite():String 공공 기능을 justwrite () : 문자열
{ (
return &#34;This is a method of the component&#34;; 반환 "이것은 구성 요소를하는 방법에 관한 것";
} )
]]> ] ">
</mx:Script> </ mx : 스크립트>

<mx:DataGrid id=&#34;myDG&#34; dataProvider=&#34;{lista}&#34; > <mx:datagrid id="mydg" dataprovider="{lista}">

</mx:DataGrid> </ mx : 데이터>

</mx:VBox> </ mx : vbox>

Flex 2文档中的声明 :在<mx:Script>标签中声明的公有变量或set函数会是这个组件的一个属性。 이 문서에서 플렉스 성명 : <mx: 스크립트 탭 매개 변수의 기능을 공개 성명 또는 설정의 속성이 구성 요소가된다. <mx:Script>标签中的公有函数会是组件的一个方法。 <mx:script> 탭의 한 구성 요소의 공용 기능을하는 방법.

我们可以在主程序文件中访问组件的方法或者传值给组件的属性: 우리가 문서를 메인 프로그램에 액세스할 수있습니다 -하는 방법이나 구성 요소를 구성 요소의 값을 속성 :

<?xml version=&#34;1.0&#34; encoding=&#34;utf-8&#34;?> <? xml 버전 = "1.0"인코딩 = "utf - 8"?>
<mx:Application xmlns:mx=&#34;http://www.adobe.com/2006/mxml&#34; layout=&#34;absolute&#34; xmlns:cust=&#34;*&#34;> <mx : 응용 프로그램 xmlns : mx = "http://www.adobe.com/2006/mxml"레이아웃 = "절대적인"xmlns : 고객 = "*" ;>
<mx:Script> <mx:script>
<![CDATA[ <! [cdata [
import mx.collections.ArrayCollection; 수입 mx.collections.arraycollection;
[Bindable] [바인딩]
public var myData:ArrayCollection = new ArrayCollection ( 공공 변수 mydata : arraycollection = 새로운 arraycollection (
[{A:2000},{A:3000},{A:4000},{A:4000},{A:3000},{A:2000},{A:6000}]); [(답 : 2000), (원정 : 3000), (답 : 4000), (답 : 4000), (답 : 3000), (답 : 2000), (원정 : 6000)]);

]]> ] ">
</mx:Script> </ mx : 스크립트>
<cust:custDataGrid id=&#34;custDG&#34; x=&#34;258&#34; y=&#34;89&#34; lista=&#34;{myData}&#34;/> <cust:custdatagrid id="custdg" x="258" y="89" lista="{mydata}"/>

<mx:Label text=&#34;{custDG.justWrite()}&#34; x=&#34;300&#34; y=&#34;44&#34;/> <mx:label text="{custdg.justwrite()}" x="300" y="44"/>
</mx:Application> </ mx : 응용 프로그램>

在主程序中我们创建了一个叫做”myData”的ArrayCollection变量,我们可以通过下面的方法在MXML组件标签声明中将它传递给组件: 메인 프로그램을 만들었습니다 "mydata"arraycollection 변수, mxml 구성 요소에 다음과 같은 방법을 통해 할 수 라벨 성명, 그것에 전달되는 구성 요소 :

<cust:custDataGrid id=&#34;custDG&#34; x=&#34;258&#34; y=&#34;89&#34; lista=&#34;{myData}&#34;/> <cust:custdatagrid id="custdg" x="258" y="89" lista="{mydata}"/>

我们用来展示自定义组件中定义的属性的Flex数据绑定机制可以利用数据绑定特性。 우리가 주문을 받아서 구성 요소를 표시하는 데 사용 플렉스의 특성에 대한 정의를 데이터 바인딩 데이터 바인딩을 사용하는 메커니즘 특성을 수있습니다. ”lista”变量是custDataGrid组定义组件的一个公有变量,所以我们将它写在custDataGrid标签声明中。 "목록"의 구성 요소에 대한 정의를 custdatagrid 그룹이 변수를 공용 변수를, 그래서 우리는이 레이블을 custdatagrid에서 성명을 작성합니다.

类似地,也可以创建一个数据绑定调用自定义组件中的一个方法: 유사하게, 데이터 바인딩을 만들 수도있습니다 사용자 정의 구성 요소를 호출하는 방법 :

<mx:Label text=&#34;{custDG.justWrite()}&#34; x=&#34;300&#34; y=&#34;44&#34;/> <mx:label text="{custdg.justwrite()}" x="300" y="44"/>

Label控件的text属性将接收自定义组件custDataGrid的公有方法返回的文本: 텍스트 속성에 레이블을 제어하는 사용자 정의 구성 요소가 나타납니다 custdatagrid 방식으로 공공의 텍스트 :

public function justWrite():String 공공 기능을 justwrite () : 문자열
{ (
return &#34;This is a method of the component&#34;; 반환 "이것은 구성 요소를하는 방법에 관한 것";
} )

设计一个松耦合组件的最后一步是处理包含返回数据的事件的分派。 느슨한 결합의 구성 요소의 디자인의 마지막 단계는 이벤트에 데이터를 다시 할당을 포함합니다. 每个自定义MXML组件都可分派事件,事件可以通过三个简单的步骤自定义: 각각의 사용자 정의 mxml 구성 요소를 배포, 3 개의 이벤트를 통해 사용자의 간단한 단계 수있습니다 :

•使用[Event]元数据标签•创建一个事件对象•分派事件并创建一个函数来处理该事件 •의 사용을 [이벤트] 메타 - 데이터에 태그를 • • 할당 행사와 이벤트 개체를 만드는 기능을 다룰 이번 사건을 만듭니다

[Event]元数据标签定义了组件可以分派的事件。 [이벤트] 메타 데이터의 구성 요소 레이블을 할당할 수있습니다 이번 사건의 정의를합니다. 可以在一个ActionScript类中包定义之后类定义之前声明[Event]元数据标签: 카테고리 정의 범주 정의 후 actionscript하기 전에 패키지에 성명 [이벤트] 메타 데이터를 레이블 :

Package com.casario 패키지를 com.casario
{ (
[Event(name=&#34; changeBlog&#34;, type=&#34; flash.events.Event &#34;)] [이벤트 (이름 = "changeblog", 유형 = "flash.events.event")]
public class custComp 공용 클래스 custcomp
{ (

} )
} )

或者在MXML文件中的<mx:Metadata>标签中: mxml에 문서 또는 <mx: metadata> 탭 :

<mx:Metadata> <mx:metadata>
[Event(name=&#34;changeBlog&#34;, type=&#34; flash.events.Event &#34;)] [이벤트 (이름 = "changeblog", 유형 = "flash.events.event")]
</mx:Metadata> </ mx : 메타 데이터>

一旦[Event]元数据标签创建,组件就可以使用dispatchEvent()方法来分派该事件。 한 번 [이벤트] 메타 - 데이터에 태그를 만들고, 구성 요소를 사용할 수있습니다 dispatchevent () 메소드를 이번 사건을 배포합니다. dispatchEvent()方法将事件对象作为参数,如下面的代码中所示: dispatchevent () 메소드를 이벤트 개체를 매개 변수로에서 보는 바와 같이, 다음과 같은 코드 :

dispatchEvent(new Event(&#34;changeBlog&#34;)); dispatchevent (새로운 이벤트 ( "changeblog"));

我们来修改一下custDataGrid.mxml文件,使其可以在用户点击DataGrid中一项的时候分派一个事件。 우리는 문서 custdatagrid.mxml을 개정할 수 있도록 데이터를 사용자가 클릭을 행사 시간을 할당합니다. 主程序将处理自定义组件触发的事件并在一个TextArea控件中添加一些文字。 이후의 구성 요소에 대한 정의의 주요 프로그램은 주소를 텍스트의 이벤트를 실행하기 위해 제어 및 장바구니 일부 텍스트합니다.

使用Flex Builder 2打开custDataGrid.mxml 并添加[Event]元数据标签: 플렉스 빌더를 열고이 custdatagrid.mxml의 사용을 장바구니 [이벤트] 메타 데이터를 레이블 :

<?xml version=&#34;1.0&#34; encoding=&#34;utf-8&#34;?> <? xml 버전 = "1.0"인코딩 = "utf - 8"?>
<mx:VBox xmlns:mx=&#34;http://www.adobe.com/2006/mxml&#34;> <mx:vbox xmlns:mx="http://www.adobe.com/2006/mxml">

<mx:Metadata> <mx:metadata>
[Event(name=&#34;changeBlog&#34;, type=&#34;flash.events.Event&#34;)] [이벤트 (이름 = "changeblog", 유형 = "flash.events.event")]
</mx:Metadata> </ mx : 메타 데이터>

<mx:Script> <mx:script>
<![CDATA[ <! [cdata [
import mx.collections.ArrayCollection; 수입 mx.collections.arraycollection;

[Bindable] [바인딩]
public var lista:ArrayCollection; 공공 변수 목록 : arraycollection;

public function justWrite():String 공공 기능을 justwrite () : 문자열
{ (
return &#34;This is a method of the component&#34;; 반환 "이것은 구성 요소를하는 방법에 관한 것";
} )

private function changeHandler():void 민간 기능을 changehandler () : 무효
{ (
dispatchEvent(new Event(&#34;changeBlog&#34;)); dispatchevent (새로운 이벤트 ( "changeblog"));
} )
]]> ] ">
</mx:Script> </ mx : 스크립트>

<mx:DataGrid id=&#34;myDG&#34; dataProvider=&#34;{lista}&#34; change=&#34;changeHandler()&#34; > <mx:datagrid id="mydg" dataprovider="{lista}" change="changehandler()">

</mx:DataGrid> </ mx : 데이터>

</mx:VBox> </ mx : vbox>

[Event]元数据标签定义了一个普通Event类型的&#34;changeBlog&#34;事件并且将这个事件设为公有的,这样MXML编译器就会发现它。 [이벤트] 메타 데이터를 일반적인 유형의 정의에 레이블을 행사 "changeblog"이 사건을 설정하고 공공 이벤트, 그러한 mxml 컴파일러는 그걸 찾을 수있어.

<mx:Metadata> <mx:metadata>
[Event(name=&#34;changeBlog&#34;, type=&#34;flash.events.Event&#34;)] [이벤트 (이름 = "changeblog", 유형 = "flash.events.event")]
</mx:Metadata> </ mx : 메타 데이터>

当DataGrid的change事件被触发时这个事件就会被分派: 사건이 발생하면 데이터가이 사건의 변화에 할당됩니다 :

<mx:DataGrid id=&#34;myDG&#34; dataProvider=&#34;{lista}&#34; change=&#34;changeHandler()&#34; > <mx:datagrid id="mydg" dataprovider="{lista}" change="changehandler()">

正如你看到的那样,&#34;changeHandler&#34;函数简单地执行了dispatchEvent()方法: 로 보여, "changehandler"를 구현하는 간단한 기능을 dispatchevent () :

private function changeHandler():void 민간 기능을 changehandler () : 무효
{ (
dispatchEvent(new Event(&#34;changeBlog&#34;)); dispatchevent (새로운 이벤트 ( "changeblog"));
} )

主程序通过使用<mx:Script>块中定义的事件处理函数来处理自定义MXML组件所触发的事件: 메인 프로그램을 통해 <mx: 스크립트의 사용을 차단의 기능에 대한 정의를 mxml 구성 요소를 다루는 사용자 정의에 의해 발생한이 사건의 이벤트 :

<?xml version=&#34;1.0&#34; encoding=&#34;utf-8&#34;?> <? xml 버전 = "1.0"인코딩 = "utf - 8"?>
<mx:Application xmlns:mx=&#34;http://www.adobe.com/2006/mxml&#34; layout=&#34;absolute&#34; xmlns:cust=&#34;*&#34;> <mx : 응용 프로그램 xmlns : mx = "http://www.adobe.com/2006/mxml"레이아웃 = "절대적인"xmlns : 고객 = "*" ;>
<mx:Script> <mx:script>
<![CDATA[ <! [cdata [
import mx.collections.ArrayCollection; 수입 mx.collections.arraycollection;
[Bindable] [바인딩]
public var myData:ArrayCollection = new ArrayCollection ( 공공 변수 mydata : arraycollection = 새로운 arraycollection (
[{A:2000},{A:3000},{A:4000},{A:4000},{A:3000},{A:2000},{A:6000}]); [(답 : 2000), (원정 : 3000), (답 : 4000), (답 : 4000), (답 : 3000), (답 : 2000), (원정 : 6000)]);

private function changeBlogHandler (event:Event):void 민간 기능을 changebloghandler (이벤트 : 이벤트) : 무효
{ (
myLabel2.text = &#34;Event fired by Datagrid:&#34; event.type &#34;\n&#34; ; mylabel2.text = "이벤트 발사한 데이터 :" event.type "\ n";
} )

]]> ] ">
</mx:Script> </ mx : 스크립트>
<cust:custDataGrid id=&#34;custDG&#34; x=&#34;258&#34; y=&#34;89&#34; lista=&#34;{myData}&#34; changeBlog=&#34;changeBlogHandler(event)&#34;/> <고객 : custdatagrid 번호 = "custdg"* = "258"및 = "89"목록 = "(mydata)"changeblog = & # 34; changebloghandler (이벤트) "/>

<mx:Label text=&#34;{custDG.justWrite()}&#34; id=&#34;myLabel&#34; x=&#34;283&#34; y=&#34;63&#34;/> <mx : 레이블 텍스트를 = "(custdg.justwrite ())"번호 = "mylabel"* = "283"및 = "63" ; />
<mx:TextArea id=&#34;myLabel2&#34; x=&#34;205&#34; y=&#34;239&#34; height=&#34;102&#34; width=&#34;273&#34;/> <mx : 텍스트 번호 = "mylabel2"* = "205"및 = "239"높이 = "102"너비 = " 273 "/>
</mx:Application> </ mx : 응용 프로그램>

custDataGrid组件触发&#34;changeBlog&#34;事件并将它与一个事件处理函数相关联: custdatagrid 구성 요소를 트리거 "changeblog"사고와 사고의 기능과 연관된 :

<cust:custDataGrid id=&#34;custDG&#34; x=&#34;258&#34; y=&#34;89&#34; lista=&#34;{myData}&#34; changeBlog=&#34;changeBlogHandler(event)&#34;/> <고객 : custdatagrid 번호 = "custdg"* = "258"및 = "89"목록 = "(mydata)"changeblog = & # 34; changebloghandler (이벤트) "/>

changeBlogHandler函数将事件对象作为一个参数并在TextAream控件中打印了一个简单的文本: changebloghandler 이벤트 개체가 정상적으로 textaream에 대한 매개 변수를 제어 및을 인쇄하는 간단한 텍스트 :

private function changeBlogHandler (event:Event):void 민간 기능을 changebloghandler (이벤트 : 이벤트) : 무효
{ (
myLabel2.text = &#34;Event fired by Datagrid:&#34; event.type &#34;\n&#34; ; mylabel2.text = "이벤트 발사한 데이터 :" event.type "\ n";
} )

注意使用事件对象的event.type 会返回事件触发者的类型(这个例子中会返回changeblog )。 이벤트 개체의 사용에 event.type 사건의 유형을 트리거으로 돌아갑니다 (이 예에서 changeblog으로 돌아갑니다).

注意 :Flex Builder 2会自动找到在组件中自定义事件的引用并使用显示代码提示显示它: 참고 사항 : 플렉스 빌더 2는 사용자 지정 구성 요소를 자동으로 검색이 사건과 코드가 그것의 사용을 인용 팁 :

[fig. flexbuilder_customEvent.png] Flex Builder 2 identifies the event name [그림합니다. flexbuilder_customevent.png] 플렉스 빌더 2 식별하는 이벤트 이름

尽管我们可以看到为松耦合组件创建一个自定义事件是多么简单,但是如果我们想要发送数据给这个自定义事件,这种方式也会有一些限制。 비록 우리가 볼 수있는가 느슨하게 결합된 구성 요소를 만드는 사용자 정의 사례는 너무 간단하지만 우리가 원하는 데이터를 보내는 경우에 사용자 정의, 이쪽으로 일부 제한 사항에 해당됩니다. 实际上flash.events.Event类不允许开发者向其添加属性。 사실 분류 flash.events.event의 개발자를 추가할 것을 허용하지 않습니다 특성을합니다.

实际上我们分派事件只是为了通知在自定义MXML组件中有一些事情发生了。 사실, 우리 분산에만 사용자 정의 mxml 구성 요소를 어디에서이 사건은 여러 가지 일들이 일어나기합니다. 但是如果我们需要发送复杂的数据给一个自定义事件的时候要怎么办呢? 그러나, 만약 우리가 복잡한 데이터를 보낼 필요가를 사용자 지정을 수행하는 방법에 사건을 때»

不用担心。 걱정하지 마. 我们可以通过在ActionScript中创建自定义事件类来实现! 사용자 지정 이벤트를 만들 수있습니다 actionscript 우리의 범주를 달성하기! 我将会通过一个例子向你展示如何开发自定义事件类。 그럴 꺼야을 통해보기를 사용자 지정 이벤트를 개발하는 방법을 보여줍니다 분류합니다.

在ActionScript中创建自定义事件类来发送复杂数据 사용자 지정 이벤트를 만들 범주를 actionscript에서 복잡한 데이터 전송

使用Flex可以创建一个使用自定义类型的事件对象的自定义事件。 의 사용을 플렉스의 사용을 사용자 정의 유형의 이벤트 개체를 만들 수있습니다 사용자 지정 이벤트합니다. 只需要创建一个扩展自Event类的子类然后向其中添加属性。 일종의 확대를 만들기만하면 이후의 이벤트의 종류 및 특성에 추가합니다. 不要忘了扩展自既有Flex类的自定义组件会继承基类的所有事件。 기존의 플렉스 잊지 마세요 같은 구성 요소를 확장하려면 사용자 지정 기본 클래스의 모든 이벤트를 상속합니다.

要创建一个自定义类我们需要创建一个扩展自flash.events.Event的ActionScript类,这个类将作为所有事件对象的基类。 사용자 정의 범주를 만들 필요 actionscript를 만들 클래스를 섬길 것입니다 flash.events.event 확장 이후의 모든 이벤트를 해당 개체로 분류합니다. 接下来,为了调用父类的构造方法并将事件类型传给它,我们要调用super()方法。 다음은이 순서를 호출하여 카테고리의 아버지 유형의 건설 방법과 패스, 우리는 슈퍼에 전화 () 메소드를합니다. 我们还需要覆写&#34;clone()&#34; 方法,通过设定type属性和其它一些属性来返回事件对象的一个拷贝。 또한 필요가 재정의하는 "클론 ()"방법을, 세트 종류와 다른 특성을 일부 속성의 복사본을 이벤트 개체를 반환합니다.

为了从自定义组件中分派一个新的事件,我们创建了这个自定义类的一个实例并传送属性值给它。 사용자 정의 구성 요소를 배포하기 위해 새로운 사건, 우리가 만들어 예로 이후이 카테고리의 정의와 속성 값을 전송합니다.

现在我会用一个例子来说明这种方式。 나는 지금은이 방법을 사용하는 예제을 설명합니다. 我们创建了一个简单的Blog阅读器,它允许用户使用下拉列表框从Blog列表中选择一个。 우리가 만든 간단한 블로그 독자, 이것은 사용자가 드롭 - 다운 목록 상자를 사용하여 목록에서 블로그를 선택하십시오. 这个程序由2个MXML组件组成,这两个组件是一个用来显示日志内容的DataGrid以及一个含有Blog列表下拉列表框。 이 절차를 수행하는 두 개의 구성 요소를 mxml,이 두 개의 구성 요소는 로그의 블로그의 콘텐츠가 데이터를 표시하고 드롭 - 다운 목록 상자의 목록을 포함합니다.

我们将从一个自定义事件类(它被保存为&#34;evtClass.as&#34;,并放在了”com”文件夹里)开始,它接受一个简单字符串属性: 우리는 사용자 정의 이벤트 범주 (그것이 구원을 "evtclass.as", 그리고 "com"폴더에), 그 수락 간단한 문자열을 속성 :

package com 패키지 com
{ (
import flash.events.Event; 수입 flash.events.event;

public class evtClass extends Event 공용 클래스 evtclass 확장 이벤트
{ (

public var evProp:String; 공공 변수 evprop : 문자열;

public function evtClass(evParam:String,type:String) 공공 기능을 evtclass (evparam : 문자열, 유형 : 문자열)
{ (
super(type); 슈퍼 (타입);
this.evProp = evParam; this.evprop = evparam;
} )
override public function clone():Event 재정의 공적 기능을 클론 () : 이벤트
{ (
return new evtClass(evProp,type); 반환 새로운 evtclass (evprop를 입력);
} )
} )
} )

象我们之前说的那样,这个类扩展自flash.events.Event类,调用了super()方法并且覆写了clone()方法。 로 우리가 이미 전에, flash.events.event 이후이 범주로 분류 확장, 전화를 슈퍼 () 메소드를 재정의하는 클론 () 메소드를합니다.

现在,在Flex Builder 2中创建一个组件(File > New > MXML Component)并保存为custBlogList.mxml。 지금, 플렉스 빌더 2의 창조의 구성 요소 (파일> 새> mxml 구성 요소) 및 저장 custbloglist.mxml로합니다. 这个组件包含有一个下拉列表框(ComboBox)并且它的dataProvider是一个ArrayCollection对象。 드롭 - 다운 목록 상자의 구성 요소를 포함 (콤보) 및 그 dataProvider라는 개체가 arraycollection합니다.

<?xml version=&#34;1.0&#34; encoding=&#34;utf-8&#34;?> <? xml 버전 = "1.0"인코딩 = "utf - 8"?>
<mx:VBox xmlns:mx=&#34;http://www.adobe.com/2006/mxml&#34; > <mx:vbox xmlns:mx="http://www.adobe.com/2006/mxml">

<mx:Metadata> <mx:metadata>
[Event(name=&#34;changeBlog&#34;, type=&#34;com.evtClass&#34;)] [이벤트 (이름 = "changeblog", 유형 = "com.evtclass")]
</mx:Metadata> </ mx : 메타 데이터>

<mx:Script> <mx:script>
<![CDATA[ <! [cdata [

import com.evtClass; 수입 com.evtclass;
private function init():void 민간 기능을 init () : 무효
{ (
myArray.addItemAt({label:&#34;Alistair McLeod&#34;, data:&#34;http://weblogs.macromedia.com/amcleod/index.xml&#34;}, 0); myarray.additemat ((상표 : "알리스 테어 mcleod", 데이터 : "http://weblogs.macromedia.com/amcleod/index.xml"), 0);
} )
private function changeHandler():void 민간 기능을 changehandler () : 무효
{ (
var eventObj:evtClass = new evtClass(myCombo.value as String,&#34;changeBlog&#34;); 변수 eventobj : evtclass = 새로운 evtclass (mycombo.value로 문자열을, "changeblog");
dispatchEvent(eventObj); dispatchevent (eventobj);
} )

]]> ] ">
</mx:Script> </ mx : 스크립트>

<mx:ComboBox id=&#34;myCombo&#34; change=&#34;changeHandler()&#34; creationComplete=&#34;init();myCombo.sel&#101;ctedIndex=0&#34; > <mx:combobox id="mycombo" change="changehandler()" creationcomplete="init();mycombo.selectedindex=0">
<mx:ArrayCollection id=&#34;myArray&#34;> <mx:arraycollection id="myarray">
<mx:Object label=&#34;Mike Chambers&#34; data=&#34;http://weblogs.macromedia.com/mesh/index.xml&#34;/> <mx:object label="mike chambers" data="http://weblogs.macromedia.com/mesh/index.xml"/>
<mx:Object label=&#34;Matt Chotin&#34; data=&#34;http://weblogs.macromedia.com/mchotin/index.xml&#34;/> <mx:object label="matt chotin" data="http://weblogs.macromedia.com/mchotin/index.xml"/>
</mx:ArrayCollection> </ mx : arraycollection>
</mx:ComboBox> </ mx : 콤보>

</mx:VBox> </ mx : vbox>

我们使用了[Event]元数据标签定义了这个MXML组件可以分派的事件。 우리가 사용하는 [이벤트] 메타 데이터를 정의에의 경우 라벨이 mxml 구성 요소를 할당할 수있습니다. 赋给type属性的值就是我们的自定义事件类: 할당하는 값 유형 특성은 우리의 사용자 지정 이벤트 카테고리 :

<mx:Metadata> <mx:metadata>
[Event(name=&#34;changeBlog&#34;, type=&#34;com.evtClass&#34;)] [이벤트 (이름 = "changeblog", 유형 = "com.evtclass")]
</mx:Metadata> </ mx : 메타 데이터>

一旦用户在下拉列表框中选择了一个Blog,change事件就会被触发并且changeHandler()会被调用: 일단 사용자의 드롭 - 다운 목록 상자를 선택하십시오 블로그, 변경 이벤트가 발생하고 changehandler ()가 호출됩니다 :

<mx:ComboBox id=&#34;myCombo&#34; change=&#34;changeHandler()&#34; creationComplete=&#34;init();myCombo.sel&#101;ctedIndex=0&#34; > <mx:combobox id="mycombo" change="changehandler()" creationcomplete="init();mycombo.selectedindex=0">

这个事件处理器只有一个作用,就是创建一个自定义事件类的实例并将用户所选择的值传送给这个实例(将myCombo中的值作为一个字符串): 하나의 프로세서에만이 사건은 사용자 정의 범주의 사건을 만들 및 예제의 가치를 보내는 사용자에 의해 선택이 사건을 (를 mycombo 값을 문자열로) :

private function changeHandler():void 민간 기능을 changehandler () : 무효
{ (
var eventObj:evtClass = new evtClass(myCombo.value as String,&#34;changeBlog&#34;); 변수 eventobj : evtclass = 새로운 evtclass (mycombo.value로 문자열을, "changeblog");
dispatchEvent(eventObj); dispatchevent (eventobj);
} )

第二个MXML组件包含了DataGrid控件并且从主程序中接收dataProvider。 두 번째 구성 요소를 포함 컨트롤을 메인 프로그램 및 수신 데이터 mxml dataProvider라는합니다. 现在你需要将这个文件保存为custBlogData.mxml: 이제으로 파일을 저장하려면 이것이 필요 custblogdata.mxml :

<?xml version=&#34;1.0&#34; encoding=&#34;utf-8&#34;?> <? xml 버전 = "1.0"인코딩 = "utf - 8"?>
<mx:VBox xmlns:mx=&#34;http://www.adobe.com/2006/mxml&#34;> <mx:vbox xmlns:mx="http://www.adobe.com/2006/mxml">

<mx:Script> <mx:script>
<![CDATA[ <! [cdata [
import mx.collections.ArrayCollection; 수입 mx.collections.arraycollection;
import flash.net.*; 수입 flash.net .*;
[Bindable] [바인딩]
public var lista:ArrayCollection; 공공 변수 목록 : arraycollection;
]]> ] ">
</mx:Script> </ mx : 스크립트>

<mx:DataGrid id=&#34;myDG&#34; horizontalCenter=&#34;14&#34; verticalCenter=&#34;18.5&#34; dataProvider=&#34;{lista}&#34; width=&#34;100%&#34; <mx : 데이터 번호 = "mydg"horizontalcenter = "14"verticalcenter = "18.5"dataProvider라는 = "(목록)"폭 = "100 %"
change=&#34;navigateToURL(new URLRequest(myDG.sel&#101;ctedItem.link),&#39;_blank&#39;);&#34; > 변경 = "navigatetourl (새로운 urlrequest (mydg.selecteditem.link), '_blank ');">
<mx:columns>
<mx:DataGridColumn headerText=&#34;Posts&#34; dataField=&#34;title&#34; /> <mx:datagridcolumn headertext="posts" datafield="title" />
<mx:DataGridColumn headerText=&#34;Date&#34; dataField=&#34;pubDate&#34; width=&#34;100&#34; /> <mx:datagridcolumn headertext="date" datafield="pubdate" width="100" />
</mx:columns> </ mx : 컬럼>
</mx:DataGrid> </ mx : 데이터>

</mx:VBox> </ mx : vbox>

这个DataGrid定义了两列。 이 데이터의 정의를 두 개의합니다. 第一列从用户选择的RSS feed(在custBlogList中选择的)中获取数据。 첫 번째 열에서 사용자의 선택의 피드 (custbloglist의 선택) 데이터 액세스 속도를합니다. 第二列从类型为ArrayCollection 的变量&#34;lista&#34; 获取数据。 두 번째 열 매개 변수의 유형을 arraycollection에서 "목록"데이터 액세스 속도를합니다.

接下来,就是主程序文件了(BlogReader.mxml),它会调用上面的两个组件,调用一个HTTPService来获取rss数据并且定义了一个事件处理函数: 그런 다음, 문서가의 주요 프로그램 (blogreader.mxml), 그것은 위의 두 개의 구성 요소를 호출하여 하나 피드와 정의를 구하는 전화를 httpservice적인 데이터 처리 기능이 이번 사건 :

<?xml version=&#34;1.0&#34; encoding=&#34;utf-8&#34;?> <? xml 버전 = "1.0"인코딩 = "utf - 8"?>
<mx:Application xmlns:mx=&#34;http://www.adobe.com/2006/mxml&#34; layout=&#34;absolute&#34; xmlns:cust=&#34;*&#34; <mx : 응용 프로그램 xmlns : mx = "http://www.adobe.com/2006/mxml"레이아웃 = "절대적인"xmlns : 고객 = "*" ;
creationComplete=&#34;hs.send()&#34; > creationcomplete = "hs.send ()">
<mx:HTTPService <mx : httpservice
id=&#34;hs&#34; 번호 = "안녕"
url=&#34;{sel&#101;ctedMenu}&#34; url = "(selectedmenu)"
useProxy=&#34;false&#34;/> useproxy = "허위"/>

<mx:Script> <mx:script>
<![CDATA[ <! [cdata [

import com.evtClass; 수입 com.evtclass;

[Bindable] [바인딩]
private var sel&#101;ctedMenu:String= &#34;http://weblogs.macromedia.com/amcleod/index.xml&#34;; 사립 변수 selectedmenu : 문자열 = "http://weblogs.macromedia.com/amcleod/index.xml";

private function eventFired(event:evtClass):void 민간 기능을 eventfired (이벤트 : evtclass) : 무효
{ (

sel&#101;ctedMenu = event.evProp; selectedmenu = event.evprop;
if (sel&#101;ctedMenu == &#34;null&#34;) 만일 (selectedmenu == "널")
{ (
mx.controls.Alert.show(&#34;Please Choose a valid Blog&#34;); mx.controls.alert.show ( "유효한 블로그를 선택하십시오");
return; 반환;
}; );
hs.send(); hs.send ();
} )
]]> ] ">
</mx:Script> </ mx : 스크립트>

<mx:Panel width=&#34;70%&#34; height=&#34;70%&#34; layout=&#34;absolute&#34; title=&#34;Comtaste&#39;s Blog Reader&#34; horizontalCenter=&#34;0&#34; <mx : 패널 폭 = "70 %"높이 = "70 %"레이아웃 = "절대적인"제목 = "comtaste의 블로그 리더 "horizontalcenter ="0 "
verticalCenter=&#34;-14.5&#34;> verticalcenter = "-14.5">

<mx:Label text=&#34;{hs.lastResult.rss.channel.title}&#39;s Blog&#34; id=&#34;myLbl&#34; x=&#34;48.5&#34; y=&#34;43&#34; fontWeight=&#34;bold&#34;/> <mx : 레이블 텍스트를 = "(hs.lastresult.rss.channel.title) 님의 블로그"번호 = "mylbl"* = "48.5" ; 그리고 = "43"fontweight = "굵게"/>
<cust:custBlogList x=&#34;161&#34; y=&#34;10&#34; changeBlog=&#34;eventFired(event)&#34; /> <cust:custbloglist x="161" y="10" changeblog="eventfired(event)" />
<mx:Label x=&#34;48.5&#34; y=&#34;10&#34; text=&#34;Sel&#101;ct a Blog&#34; height=&#34;25&#34;/> <mx : 레이블 x = "48.5"및 = "10"텍스트 = "블로그를 선택하십시오"높이 = "25" ; />
<cust:custBlogData width=&#34;80%&#34; x=&#34;48.5&#34; y=&#34;69&#34; lista=&#34;{hs.lastResult.rss.channel.item}&#34; /> <고객 : custblogdata 폭 = "80 %"* = "48.5"및 = "69"목록 = "(hs.lastresult.rss합니다. channel.item) "/>
<mx:ControlBar> <mx:controlbar>
<mx:Label text=&#34;Developed by Marco Casario&#34; /> 마르코 casario" /> text="developed 의해 <mx:label
<mx:LinkButton label=&#34;http://casario.blogs.com&#34; click=&#34;navigateToURL(new <mx : linkbutton 레이블 = "http://casario.blogs.com"클릭 = "navigatetourl (새
URLRequest(&#39;http://casario.blogs.com&#39;),&#3