| djyamato |
20.12.2011 21:48 |
Цитата:
Сообщение от dimarik
(Сообщение 1052679)
Можно воспользоваться Proxy в качестве первого массива и диспатчить изменения, которые подхватит обертка второго массива.
|
Присоединяюсь
Или вот как еще можно:
При смене значения элемента одного массива он диспатчит событие о изменении значения элемента, это событие отлавливается и во 2м массиве меняется значение элемента с таким же индексом
Код AS3:
package com.CustomArray
{
import com.CustomArray.events.CustomArrayEvent;
import flash.events.Event;
import flash.events.EventDispatcher;
import flash.events.IEventDispatcher;
dynamic public class CustomArray extends Array implements IEventDispatcher
{
private var dispatcher:EventDispatcher;
public function CustomArray()
{
dispatcher = new EventDispatcher(this);
}
public function add(val:*):void
{
this.push(val);
dispatchEvent(new CustomArrayEvent(CustomArrayEvent.COLLECTION_CHANGE));
}
public function update(val:*,index:int):void
{
this[index]=val;
dispatchEvent(new CustomArrayEvent(CustomArrayEvent.COLLECTION_VALUE_CHANGE,{ind:index,value:val}));
}
/*
iEventDispatcher Implementation
*/
public function addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void
{
dispatcher.addEventListener(type, listener, useCapture, priority);
}
public function dispatchEvent(evt:Event):Boolean
{
return dispatcher.dispatchEvent(evt);
}
public function hasEventListener(type:String):Boolean
{
return dispatcher.hasEventListener(type);
}
public function removeEventListener(type:String, listener:Function, useCapture:Boolean = false):void
{
dispatcher.removeEventListener(type, listener, useCapture);
}
public function willTrigger(type:String):Boolean
{
return dispatcher.willTrigger(type);
}
}
}
Код AS3:
package com.CustomArray.events
{
import flash.events.Event;
public class CustomArrayEvent extends Event
{
public var messageData:Object;
public static const COLLECTION_CHANGE:String="collectionChange";
public static const COLLECTION_VALUE_CHANGE:String="collectionValueChange";
public function CustomArrayEvent(type:String, data:Object=null, bubbles:Boolean=false, cancelable:Boolean=false)
{
super(type, bubbles, cancelable);
var messObj:Object=new Object();
messObj.data=data;
this.messageData=messObj;
}
}
}
Использование:
Код AS3:
package
{
import com.CustomArray.CustomArray;
import com.CustomArray.events.CustomArrayEvent;
import flash.display.Sprite;
public class ArrayProxyTest extends Sprite
{
protected var _array1:CustomArray=new CustomArray();
protected var _array2:CustomArray=new CustomArray();
public function ArrayProxyTest()
{
_array1.addEventListener(CustomArrayEvent.COLLECTION_VALUE_CHANGE,sourceArrayCollectionValueChangeHandler);
_array1.addEventListener(CustomArrayEvent.COLLECTION_CHANGE,sourceArrayCollectionChangeHandler);
_array1.add(1);
_array1.add(2);
_array1.add(3);
_array1.update(45,2);
}
protected function sourceArrayCollectionChangeHandler(event:CustomArrayEvent):void
{
_array2=_array1;
trace("\nCollectionChange\nARRAY 1: "+_array1);
trace("ARRAY 2: "+_array2);
}
protected function sourceArrayCollectionValueChangeHandler(event:CustomArrayEvent):void
{
_array2[event.messageData.index]=event.messageData.value; // смена значения элемента во 2м массиве
trace("\nCollectionValueChange\nARRAY 1: "+_array1);
trace("ARRAY 2: "+_array2);
}
}
}
трэйс:
Код:
CollectionChange
ARRAY 1: 1
ARRAY 2: 1
CollectionChange
ARRAY 1: 1,2
ARRAY 2: 1,2
CollectionChange
ARRAY 1: 1,2,3
ARRAY 2: 1,2,3
CollectionValueChange
ARRAY 1: 1,2,45
ARRAY 2: 1,2,45
|