好的家伙我真的需要你超级大脑,我现在已经拔掉了所有的头发,我只想把它放在这一块上,好吧,我有一个itemrender组件,你可以在下面看到
<?xml version="1.0" encoding="utf-8"?>
<mx:HBox xmlns:mx="http://www.adobe.com/2006/mxml" width="100%" horizontalScrollPolicy="off"
creationComplete="hbox1_creationCompleteHandler(event)">
<mx:Script>
<![CDATA[
import events.ColorsEvent;
import mx.binding.utils.BindingUtils;
import mx.binding.utils.ChangeWatcher;
import mx.events.ColorPickerEvent;
import mx.events.FlexEvent;
import mx.utils.ObjectProxy;
import utils.BindingUniform;
private var _op:ObjectProxy;
private var cw:ChangeWatcher;
public function get value():String
{
return data.color;
}
override public function set data(value:Object):void
{
super.data = value;
cp.selectedColor = data.color;
}
protected function cp_changeHandler(event:ColorPickerEvent):void
{
_op[data.id] = event.color;
}
protected function hbox1_creationCompleteHandler(event:FlexEvent):void
{
if(_op == null){
_op = BindingUniform.op;
cw = BindingUtils.bindSetter(dispatchColorChange, _op, data.id);
}
}
protected function dispatchColorChange(color:uint):void
{
cp.selectedColor = color;
dispatchEvent(new ColorsEvent("colorChanged", color, data.id, true, true));
}
]]>
</mx:Script>
<mx:Text width="145"><mx:text>{data.value}</mx:text></mx:Text>
<mx:ColorPicker id="cp" dataProvider="{parentDocument.colorsDP}"
valueCommit="{data.color = cp.selectedColor}"
change="cp_changeHandler(event)" editable="false"/>
<mx:Label id="colorLb" text="{cp.selectedItem.label}"/>
</mx:HBox>
这个想法是当我在其中一个colorpicker中更改颜色时,更改事件必须更改我的_op objectProxy对象中的动态变量。
好的,当我滚动列表时,颜色保留在各自的颜色选择器中,这是好的,我的问题在于绑定,当itemRender creationcomplete事件触发时,我为变量创建了一个bindsetter,这样我就可以调度一个事件了财产变化。
我之所以需要绑定是因为有时候用户会加载以前保存的模型,我希望变量保持绑定,这样颜色选择器会正确选择颜色,希望有意义。
好的是第一个可见的行工作正常,但是当我滚动列表,并尝试更改颜色时颜色变化颜色变化但我的绑定消失了,如果我滚动回到顶部第一个那些也不再绑定了,我真的不知道还能做什么,我只是跳了一个人做了类似的事情或者只是解决了这个问题,如果可以,请帮助我,我真的需要它,我认为我的大脑会爆炸,为什么Flex中的绑定如此困难?感谢!!!
答案 0 :(得分:1)
itemRenderer
不应该到达外部以获取数据,尤其是不设置值或参与绑定或事件。它应该只对传递给它的data
起作用。它可以读取data
之外的值或data
上的值,然后可以将其广播到其他组件。
以这种方式编程,使您的itemRenderer
组件完全封装小黑盒,将大大简化开发,并且通常可以更好地工作,并避免难以查找和调试的问题,如内存泄漏和悬空项呈示器引用即使在你认为它们已经消失之后,它们也可以对这些事件做出反应。
答案 1 :(得分:1)
我只浏览了你的代码,看看是否有关于itemRenderers的不良做法,我有两个建议。首先,正如Sam所提到的,将渲染器设置为不依赖于objectProxy对象的独立组件。使用事件进行更改以进行与模型相关的更改。
其次,更重要的是,这条线是杀手锏:
cp.selectedColor = data.color;
将其替换为“value.color”