在itemRender中绑定问题

时间:2010-02-09 03:30:25

标签: flex actionscript-3

好的家伙我真的需要你超级大脑,我现在已经拔掉了所有的头发,我只想把它放在这一块上,好吧,我有一个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中的绑定如此困难?感谢!!!

2 个答案:

答案 0 :(得分:1)

itemRenderer不应该到达外部以获取数据,尤其是不设置值或参与绑定或事件。它应该只对传递给它的data起作用。它可以读取data之外的值或data上的值,然后可以将其广播到其他组件。

以这种方式编程,使您的itemRenderer组件完全封装小黑盒,将大大简化开发,并且通常可以更好地工作,并避免难以查找和调试的问题,如内存泄漏和悬空项呈示器引用即使在你认为它们已经消失之后,它们也可以对这些事件做出反应。

答案 1 :(得分:1)

我只浏览了你的代码,看看是否有关于itemRenderers的不良做法,我有两个建议。首先,正如Sam所提到的,将渲染器设置为不依赖于objectProxy对象的独立组件。使用事件进行更改以进行与模型相关的更改。

其次,更重要的是,这条线是杀手锏:

  

cp.selectedColor = data.color;

将其替换为“value.color”