플렉스 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
세 가지 다른 개체가 생성되는 것을 볼 수 있습니다. 첫 번째 항목이 중복되었는지 확인 하시겠습니까? – dirkgently
추적 출력을 제공 할 수 있습니까? – ForYourOwnGood
실제로 도움이되는 것은 initialize 메서드에 중단 점을 놓고 두 스택 모두에 대해 해당 스택을 보는 것입니다. init이 두 번 또는 어떻게 발생했는지, 왜 그 이유가 무엇인지에 대한 통찰력을 줄 수 있습니다. –