2013-11-01 14 views
0

"CheckBox"단추를 클릭하면 "ItemRendered"에서 "Main application"으로 사용자 지정 이벤트를 보낼 때 "avatarSelectedHandler()"함수가 호출되지 않을 때 문제가 있습니다. (ItemRendered) "DataGrid"에 위치하고, 나는 어도비 공식 문서를 따라 갔지만 불행하게도 나는 해결책을 찾지 못했다. 내 코드 아래주 응용 프로그램에서 사용자 지정 이벤트를 캡처 할 수 없습니다.

:

Try.mxml (메인 응용 프로그램)

<?xml version="1.0" encoding="utf-8"?> 
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
      xmlns:s="library://ns.adobe.com/flex/spark" 
      xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600" creationComplete="initApps()"> 

<fx:Script> 
    <![CDATA[ 
     import entity.Avatar; 
     import events.AvatarSelected; 
     import mx.collections.ArrayCollection; 
     import mx.controls.Alert; 

     [Bindable] 
     private var listAvatar:ArrayCollection=new ArrayCollection(); 




     public function initApps():void{ 
      getAvatar(); 
       avatarColumn.addEventListener(AvatarSelected.SELECTED_AVATAR,avatarSelectedHandler); 
      //avatarGrid.addEventListener(AvatarSelected.SELECTED_AVATAR,avatarSelectedHandler); 
      if(avatarColumn.hasEventListener(AvatarSelected.SELECTED_AVATAR)) 
      Alert.show("EventListener OK "); 

     } 
     public function avatarSelectedHandler(event:AvatarSelected):void 
     { 
      Alert.show("L'evenement est bien traité sur main"); 
     } 

     public function getAvatar():void{ 
      var date:Date=new Date(); 

      var avatar1:Avatar=new Avatar(); 
      avatar1.idAvatar=4562; 
      avatar1.pseudo="X"; 

      var avatar2:Avatar=new Avatar(); 
      avatar2.idAvatar=659; 
      avatar2.pseudo="Y"; 

      listAvatar.addItem(avatar1); 
      listAvatar.addItem(avatar2); 
     } 
    ]]> 
</fx:Script> 

<s:DataGrid x="158" y="177" width="649" height="194" fontFamily="Times New Roman" id="avatarGrid" 
      fontSize="15" requestedRowCount="4" textAlign="center" dataProvider="{listAvatar}"> 
    <s:columns> 
     <s:ArrayList> 
      <s:GridColumn dataField="isAvatar" headerText="Id" ></s:GridColumn> 
      <s:GridColumn dataField="pseudo" headerText="Pseudo"></s:GridColumn> 
      <s:GridColumn headerText="Selectionner" width="100" itemRenderer="rendered.CheckRendered" id="avatarColumn"></s:GridColumn> 


     </s:ArrayList> 
    </s:columns> 

</s:DataGrid> 
</s:Application> 

내는 "CheckRendered.mxml"

<?xml version="1.0" encoding="utf-8"?> 
<s:GridItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009" 
       xmlns:s="library://ns.adobe.com/flex/spark" 
       xmlns:mx="library://ns.adobe.com/flex/mx" 
       width="50" height="27" clipAndEnableScrolling="true"> 
<fx:Metadata> 
    [Event(name="avatarSelected", type="events.AvatarSelected")] 

</fx:Metadata> 

<fx:Script> 
    <![CDATA[ 
     import entity.Avatar;   
     import events.AvatarSelected; 
     import mx.controls.Alert; 

     protected function cBox_clickHandler(event:MouseEvent):void 
     { 
      var eventAvatar:AvatarSelected=new AvatarSelected("avatarSelected",Avatar (data)); 
      dispatchEvent(eventAvatar); 

     } 

    ]]> 
</fx:Script> 

    <s:CheckBox id="cBox" horizontalCenter="0" click="cBox_clickHandler(event)"/> 

</s:GridItemRenderer> 

내 사용자 지정 이벤트 "AvatarSelected.as"

을 ItemRendered
package events 
{ 
import entity.Avatar; 
import flash.events.Event; 
import mx.states.OverrideBase; 


public class AvatarSelected extends Event 
{ 
    public static const SELECTED_AVATAR:String = "avatarSelected"; 

    public var avatar:Avatar; 

    public function AvatarSelected(type:String, avatar:Avatar) 
    { 
     super(type); 
     this.avatar =avatar; 
    } 

} 

나는 이벤트를 캡처하는 또 다른 방법을 선택했다

package entity 
{ 
//[Bindable] 
//[RemoteClass(alias="entity.Avatar")] 

[Bindable] 
public class Avatar 
{ 
    public var idAvatar:Number; 
    public var pseudo:String; 

    } 
} 

}

내 VO "Avatar.as는"내가 인수로 이벤트를 받아들이 GridColumn를 확장하는 클래스의 SkinDataGrid을 만들었지 만 작동하지 않습니다 아직! 기본 응용 프로그램에

데이터 그리드 :

<s:DataGrid x="171" y="333" width="649" height="194" fontFamily="Times New Roman" id="avatarGridII" 
      fontSize="15" requestedRowCount="4" textAlign="center" dataProvider="{listAvatar}"> 
    <s:columns> 
     <s:ArrayList> 
      <skin:SkinDataGrid dataField="isAvatar" headerText="Id" ></skin:SkinDataGrid> 
      <skin:SkinDataGrid dataField="pseudo" headerText="Pseudo"></skin:SkinDataGrid> 
      <skin:SkinDataGrid headerText="Selectionner" width="100" itemRenderer="rendered.CheckRendered" id="avatarColumnII" avatarSelected="avatarSelectedHandler(event)"></skin:SkinDataGrid> 


     </s:ArrayList> 
    </s:columns> 

</s:DataGrid> 

SkinDataGrid.as

package skin 
{ 
import spark.components.DataGrid; 
import spark.components.gridClasses.GridColumn; 

[Event(name="avatarSelected", type="events.AvatarSelected")] 

public class SkinDataGrid extends GridColumn 
{ 
    public function SkinDataGrid() 
    { 
     super(); 
    } 

    } 
} 

어떤 생각

? 미리 감사드립니다.

답변

0

어떤 유형의 문제 (오류 유형)가 지정되어 있지 않지만 의심스러운 코드를 살펴보면 AvatarSelectedHandler가 AvatarSelected의 핸들러로 할당 할 때 MouseEvent 유형의 인수로 사용됩니다. 유형.

+0

의견을 보내 주셔서 감사합니다 (타이핑 오류). 문제는 "DataGrid"에있는 "CheckBox"(ItemRendered)를 클릭 할 때 "avatarSelectedHandler()"함수가 호출되지 않는다는 것입니다. – Saad

+0

나는 본다. 그런 다음 또 다른 문제는 리스너를 열 객체에 할당하지만 렌더러에서 이벤트가 발생한다는 것입니다. –

+0

당신은 나에게 그것을 제안 할 수있다, 나는 그것을 어떻게 할 수 있냐? – Saad

0

또한 버블 링이 활성화 된 상태에서이 이벤트를 전달할 수 있습니다 (기본적으로 Event 클래스 생성자에서 false로 설정 됨). (()는 AvatarSelected에서 세 번째 매개 변수에주의)

public function AvatarSelected(type:String, avatar:Avatar, bubbles:Boolean=false, cancelable:Boolean=false) 
{ 
    super(type, bubbles, cancelable); 
    this.avatar =avatar; 
} 

그리고 생성 이벤트는 다음과 같습니다 : 귀하의 경우

는 AvatarSelected 생성자는 그렇게 매끄러운 변경할 수 있습니다

var eventAvatar:AvatarSelected = new AvatarSelected("avatarSelected", Avatar (data), true);