我如何阻止一个数据表格的第一排的呈示器实例化/加入/初始化/等的两倍?
-
22-07-2019 - |
题
在Flex数据表格的第一行,呈示器将初始化的两倍。追踪结果显示,flex框架是可能建立的两个实例,第一行的呈示器.在更复杂的应用程序,其中呈示器包含一个数据结拾,我们看到一个无限循环发生,因为这个问题。只有第一排的呈示器被初始化的两倍。有没有一种方法要复盖flex的行为,并阻止它发生?以下代码表明了问题:
主要应用程序:
<?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>
缩写输出:
初始化:事件。目标=ItemRenderers0.dg...SimpleItemRenderer12."文本输入",null 初始化:事件。目标=ItemRenderers0.dg...SimpleItemRenderer24."文本输入",null creationComplete:事件。目标=ItemRenderers0.dg...SimpleItemRenderer24."文本输入",项目1 初始化:事件。目标=ItemRenderers0.dg...SimpleItemRenderer29."文本输入",null creationComplete:事件。目标=ItemRenderers0.dg...SimpleItemRenderer29."文本输入",第2项 creationComplete:事件。目标=ItemRenderers0.dg...SimpleItemRenderer12."文本输入",项目1
解决方案
你的呈示器是不是真的实施得当,这可能是因为你的问题
重写的集数据的方法应当设定的超级。数据=值。你不需要实现自己的_data的财产作为Flex的容器的实施IDataRenderer和已经有它。我认为,没有用你的代码,你是遇到问题的高速缓冲/回收利用。
我一般都喜欢做的是创建一个 [可绑定的]私人myProperty:对象 (通常是一个自定义MyObjectVO延伸EventDispatcher).然后,在我集数据的方法,我将集 超级。数据=值 随后通过 如果(价值!=null)myProperty=值.
这让我强烈类型我的实际数据,离开的机制的完整无损方面的IDataRenderer接口实现的画布(或其他容器)以及确保数据的适当再循环。
初始化的广告creationComplete是穷人evets在itemRenderers因为他们实际上是再循环和这些方法的不行为为人们可能预期或希望他们。
我无法表达如何有益的 这一系列由彼得*Ent在itemRenders 是我。
其他提示