2010-02-09 3 views
0

ok guy Мне действительно нужен супермод на этом, теперь я вытащил все свои волосы, я просто хочу бросить полотенце на этом, хорошо, у меня есть компонент itemrender, который вы можете видеть нижеПроблема с привязкой внутри 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 завершается событие, я создаю привязку к переменной, чтобы я мог отправить событие, когда изменение свойств.

Причина, по которой мне нужна привязка, заключается в том, что некоторые пользователи загружают предыдущую сохраненную модель, и я хочу, чтобы переменные оставались связующими, поэтому colorpicker правильно отобразит цвет, надеясь, что это будет смысл.

Хорошо, что первая работа видимых строк работает нормально, но когда я просматриваю список и пытаюсь изменить цвет изменения цвета в colorpicker, но моя привязка исчезла, и если я прокручу назад, первые тоже не привязываются больше, я действительно не знаю, что еще делать, я просто скачу, что кто-то сделал что-то похожее или просто решил это, пожалуйста, помогите мне, если можете, мне это действительно нужно , Я думаю, мой мозг собирается взорваться, почему привязка настолько сложна в Flex? благодаря!!!

+0

хотел бы помочь вам, но это очень трудно понять ваш вопрос. попробуйте разбить его на более мелкие части. –

ответ

1

itemRenderer не должен заходить наружу, чтобы извлекать данные и, в частности, не устанавливать значения или участвовать в привязках или событиях. Он должен действовать только на переданный ему data. Он может считывать значения из data или устанавливать значения на data, которые затем могут передаваться другим компонентам.

Программирование таким образом, что делает компоненты itemRenderer полностью инкапсулированными маленькими черными ящиками, значительно упростит разработку и, как правило, будет работать намного лучше и избежать труднодоступных и отладочных проблем, таких как утечки памяти и оборванные ссылки на визуализаторы элементов чтобы даже после того, как вы давно думали, что они исчезли.

1

Я только просмотрел ваш код, чтобы узнать, есть ли плохие практики с itemRenderers, и у меня есть два предложения. Во-первых, как сказал Сэм, сделайте рендеринга автономным компонентом, который не зависит от объекта objectProxy. Используйте события, чтобы внести изменения в изменения, связанные с моделью.

Во-вторых, и что более важно, эта линия является убийцей:

cp.selectedColor = data.color;

заменить его «value.color»

+0

mmm, хорошо, я сделаю это спасибо за ваш ответ, и да, я согласен с обоими, я меняю свой дизайн, и теперь я могу связать, спасибо! – goseta

Смежные вопросы