2009-03-14 3 views
4

플렉스 DataGrid의 첫 번째 행에서 itemRenderer는 두 번 초기화됩니다. 결과를 추적하면 flex 프레임 워크가 첫 번째 행의 itemRenderer 인스턴스를 두 개 만들 가능성이 있음을 알 수 있습니다. itemRenderer에 데이터 바인딩 된 ColorPicker가 포함 된보다 복잡한 응용 프로그램에서는이 문제로 인해 무한 루프가 발생합니다. 첫 번째 행의 itemRenderer 만 두 번 초기화됩니다. flex의 동작을 오버라이드 (override) 해, 이것을 막는 방법이 있습니까?DataGrid의 첫 번째 행 itemRenderer가 인스턴스화/추가/초기화/etc를 두 번 중단하는 방법은 무엇입니까?

주요 응용 프로그램 :

<?xml version="1.0" encoding="utf-8"?> 
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" initialize="on_initialize(event);"> 
<mx:Script> 
<![CDATA[ 
/** 
* This experiment shows how the first row's itemrenderer is instantiated/added/initialized twice. 
* We've never even noticed this before we found that a data-bound ColorPicker enters a infinite 
* loop when it is within an itemRenderer. 
*/ 
    import mx.collections.ArrayCollection; 
    import mx.events.FlexEvent; 

    private var dg_array:Array; 
    private var dg_arrayCollection:ArrayCollection; 

    private function on_initialize(event:FlexEvent):void { 
     dg_array = new Array(); 
     dg_arrayCollection = new ArrayCollection(); 
     dg_arrayCollection.addItem("item 1"); 
     dg_arrayCollection.addItem("item 2"); 

     dg.dataProvider = dg_arrayCollection; 
    } 
]]> 
</mx:Script> 
<mx:DataGrid id="dg" width="100%" height="100%" rowCount="5"> 
    <mx:columns> 
     <mx:DataGridColumn headerText="Name" itemRenderer="SimpleItemRenderer"/> 
    </mx:columns> 
</mx:DataGrid> 
</mx:Application> 

SimpleItemRenderer :

<?xml version="1.0" encoding="utf-8"?> 
<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml" width="400" height="300" initialize="//on_initialize(event);"> 
<mx:Script> 
    <![CDATA[ 
     import mx.events.FlexEvent; 

     [Bindable] 
     override public function set data(value:Object):void { _data = value; }     
     override public function get data():Object { return _data; } 
     private var _data:Object; 

     private function on_initialize_textInput(event:FlexEvent):void { 
      trace("initialize:event.target="+event.target+", " + _data); // runs twice, for the first item only 

     } 

     private function on_creationComplete_textInput(event:FlexEvent):void { 
      trace("creationComplete:event.target="+event.target+", " + _data); // runs twice, for the first item only 
     } 
    ]]> 
</mx:Script> 
<mx:TextInput text="{data}" id="textInput" initialize="on_initialize_textInput(event);" creationComplete="on_creationComplete_textInput(event);"/> 
</mx:Canvas> 

단축 출력 :

초기화 : event.target = ItemRenderers0.dg ... SimpleItemRenderer12 다음 코드는 문제를 보여줍니다 .textInput, null 초기화 : event.target = ItemRenderers0.dg ... SimpleItemRenderer24.textInput, null creationComplete : event.target = ItemRenderers0.dg ... SimpleItemRenderer24.textInput, item 1 초기화 : event.target = ItemRenderers0.dg ... SimpleItemRenderer29.textInput, null creationComplete : event.target = ItemRenderers0.dg ... SimpleItemRenderer29.textInput, 항목 2 의 creationComplete : event.target = ItemRenderers0.dg ... SimpleItemRenderer12.textInput, 항목 1

+0

세 가지 다른 개체가 생성되는 것을 볼 수 있습니다. 첫 번째 항목이 중복되었는지 확인 하시겠습니까? – dirkgently

+0

추적 출력을 제공 할 수 있습니까? – ForYourOwnGood

+0

실제로 도움이되는 것은 initialize 메서드에 중단 점을 놓고 두 스택 모두에 대해 해당 스택을 보는 것입니다. init이 두 번 또는 어떻게 발생했는지, 왜 그 이유가 무엇인지에 대한 통찰력을 줄 수 있습니다. –

답변

1

당신의 itemRenderer 정말 제대로 구현되지 않으며,이이 문제의 원인 일 수 있습니다

재정의 된 세트 데이터 메소드는 super.data = value로 설정해야합니다. Flex 컨테이너가 IDataRenderer를 구현하고 이미 가지고 있기 때문에 자신의 _data 속성을 구현할 필요가 없습니다. 코드를 실행하지 않고도 캐시/재활용 문제가 발생한다고 생각합니다.

보통 내가 선호하는 것은 [Bindable] private myProperty : Object (일반적으로 EventDispatcher를 확장하는 사용자 정의 MyObjectVO)입니다. 그런 다음 내 설정 데이터 메서드에서 (값! = null) myProperty = 값 인 경우 super.data = 값 다음에 을 설정합니다.

이것은 실제 데이터를 강력하게 입력하고 Canvas (또는 다른 컨테이너)에 의해 구현 된 IDataRenderer 인터페이스와 관련하여 메커니즘을 그대로두고 데이터가 올바르게 재활용되도록합니다.

initialize ad creationComplete는 itemRenderers에서 실제로 재활용되므로 이러한 메소드는 기대하거나 원하지 않는대로 동작하지 않기 때문에 좋지 않습니다.

나는 얼마나 유익한 this series by Peter Ent on itemRenders이 나를 위해 있었는지 표현할 수 없다.

+0

"initialize ad creationComplete는 itemRenderers에서 실제로 재활용되어 이러한 메소드가 예상하거나 원하지 않는대로 동작하지 않기 때문에 좋지 않습니다." 어떤 대안이 있습니까? – Amalgovinus

관련 문제