djyamato
08.05.2012, 01:38
Здравствуйте
У меня есть 2 листа
Пользователь из первого перетаскивает объект ImageVO
Мне нужно чтобы при drop на 2м листе создавался объект в его дата провайдере (ContentVO) одним из свойств которого был бы перетаскиваемый ImageVO
Во 2 м листе в слушателе dragDrop дата провайдер не меняется. Почему ?
Далее я формирую новый объект ContentVO, добавляю его в dataProvider 2го листа и вижу 2 айтема в нем
1й - ImageVO и 2й-ContentVO. Причем, в дата провайдере 2го нет элемента ImageVO
Что мне сделать чтобы в листе 2м не появлялся перетянутый ImageVO ?
P.S. Проверил, после dragDrop у 2го листа в скроллере в DataDroup нет детей, а визуально он есть, тот который я перетащил
trace("elements:"+DataGroup(galleryContent.scroller.viewport).numElements);
// elements:0
--------------
Вроде, сделал но как-то кривовато мне кажется, покритикуйте пожалуйста
<fx:Script>
<![CDATA[
import mx.collections.ArrayCollection;
import mx.core.DragSource;
import mx.events.CollectionEvent;
import mx.events.CollectionEventKind;
import mx.events.DragEvent;
import mx.events.FlexEvent;
import mx.managers.DragManager;
import mx.messaging.AbstractConsumer;
import mx.utils.ObjectUtil;
import spark.components.Image;
[Bindable]
protected var someDataAC:ArrayCollection=new ArrayCollection();
[Bindable]
protected var contentAC:ArrayCollection=new ArrayCollection();
protected function application1_creationCompleteHandler(event:FlexEvent):void
{
for(var i:int=0;i<5;i++)
{
var someData:SomeDataVO=new SomeDataVO();
someData.id=Math.round(Math.random()*100);
someData.label="data"+someData.id;
someDataAC.addItem(someData);
}
contentAC.addEventListener(CollectionEvent.COLLECTION_CHANGE,contentDPChangeHandler);
}
protected function contentList_dragDropHandler(event:DragEvent):void
{
var dropTarget:List=List(event.currentTarget);
var items:Array = Array(event.dragSource.dataForFormat("itemsByIndex"));
// если нет пока дата провайдера нужно его завести
if(!List(event.currentTarget).dataProvider)
{
List(event.currentTarget).dataProvider=new ArrayCollection();
}
// создание нового ContentVO, свойство data у которого брошенный в список объект SomeDataVO
var newContentVO:ContentVO=new ContentVO();
newContentVO.id=Math.round(Math.random()*1000);
newContentVO.data=items[0][0];
List(event.currentTarget).dataProvider.addItem(newContentVO);
}
protected function contentDPChangeHandler(event:CollectionEvent):void
{
switch(event.kind)
{
case CollectionEventKind.ADD:
// при изменении дата провайдера (добавление элемента) проверяю тип добавленного,
//если он НЕ ContentVO, элемент нужно удалить из дата провайдера
var indexesToRemove:Array=new Array();
var i:int;
for(i=0;i<contentList.dataProvider.length;i++)
{
if(!(contentList.dataProvider.getItemAt(i) is ContentVO))
{
indexesToRemove.push(i);
}
}
for(i=0;i<indexesToRemove.length;i++)
{
contentList.dataProvider.removeItemAt(indexesToRemove[i]);
}
break;
}
}
]]>
</fx:Script>
<s:HGroup>
<s:List id="dataList"
dragEnabled="true"
itemRenderer="SomeDataItemRenderer"
dataProvider="{someDataAC}"/>
<s:List id="contentList"
dropEnabled="true"
dataProvider="{contentAC}"
itemRenderer="ContentItemRenderer"
dragDrop="contentList_dragDropHandler(event)"/>
</s:HGroup>
SomeDataVO
package
{
[RemoteClass]
public class SomeDataVO
{
public var id:int;
[Bindable]
public var label:String;
public function SomeDataVO()
{
}
}
}
ContentVO
package
{
[RemoteClass]
public class ContentVO
{
public var id:int;
[Bindable]
public var label:String;
[Bindable]
public var data:SomeDataVO;
public function ContentVO()
{
}
}
}
У меня есть 2 листа
Пользователь из первого перетаскивает объект ImageVO
Мне нужно чтобы при drop на 2м листе создавался объект в его дата провайдере (ContentVO) одним из свойств которого был бы перетаскиваемый ImageVO
Во 2 м листе в слушателе dragDrop дата провайдер не меняется. Почему ?
Далее я формирую новый объект ContentVO, добавляю его в dataProvider 2го листа и вижу 2 айтема в нем
1й - ImageVO и 2й-ContentVO. Причем, в дата провайдере 2го нет элемента ImageVO
Что мне сделать чтобы в листе 2м не появлялся перетянутый ImageVO ?
P.S. Проверил, после dragDrop у 2го листа в скроллере в DataDroup нет детей, а визуально он есть, тот который я перетащил
trace("elements:"+DataGroup(galleryContent.scroller.viewport).numElements);
// elements:0
--------------
Вроде, сделал но как-то кривовато мне кажется, покритикуйте пожалуйста
<fx:Script>
<![CDATA[
import mx.collections.ArrayCollection;
import mx.core.DragSource;
import mx.events.CollectionEvent;
import mx.events.CollectionEventKind;
import mx.events.DragEvent;
import mx.events.FlexEvent;
import mx.managers.DragManager;
import mx.messaging.AbstractConsumer;
import mx.utils.ObjectUtil;
import spark.components.Image;
[Bindable]
protected var someDataAC:ArrayCollection=new ArrayCollection();
[Bindable]
protected var contentAC:ArrayCollection=new ArrayCollection();
protected function application1_creationCompleteHandler(event:FlexEvent):void
{
for(var i:int=0;i<5;i++)
{
var someData:SomeDataVO=new SomeDataVO();
someData.id=Math.round(Math.random()*100);
someData.label="data"+someData.id;
someDataAC.addItem(someData);
}
contentAC.addEventListener(CollectionEvent.COLLECTION_CHANGE,contentDPChangeHandler);
}
protected function contentList_dragDropHandler(event:DragEvent):void
{
var dropTarget:List=List(event.currentTarget);
var items:Array = Array(event.dragSource.dataForFormat("itemsByIndex"));
// если нет пока дата провайдера нужно его завести
if(!List(event.currentTarget).dataProvider)
{
List(event.currentTarget).dataProvider=new ArrayCollection();
}
// создание нового ContentVO, свойство data у которого брошенный в список объект SomeDataVO
var newContentVO:ContentVO=new ContentVO();
newContentVO.id=Math.round(Math.random()*1000);
newContentVO.data=items[0][0];
List(event.currentTarget).dataProvider.addItem(newContentVO);
}
protected function contentDPChangeHandler(event:CollectionEvent):void
{
switch(event.kind)
{
case CollectionEventKind.ADD:
// при изменении дата провайдера (добавление элемента) проверяю тип добавленного,
//если он НЕ ContentVO, элемент нужно удалить из дата провайдера
var indexesToRemove:Array=new Array();
var i:int;
for(i=0;i<contentList.dataProvider.length;i++)
{
if(!(contentList.dataProvider.getItemAt(i) is ContentVO))
{
indexesToRemove.push(i);
}
}
for(i=0;i<indexesToRemove.length;i++)
{
contentList.dataProvider.removeItemAt(indexesToRemove[i]);
}
break;
}
}
]]>
</fx:Script>
<s:HGroup>
<s:List id="dataList"
dragEnabled="true"
itemRenderer="SomeDataItemRenderer"
dataProvider="{someDataAC}"/>
<s:List id="contentList"
dropEnabled="true"
dataProvider="{contentAC}"
itemRenderer="ContentItemRenderer"
dragDrop="contentList_dragDropHandler(event)"/>
</s:HGroup>
SomeDataVO
package
{
[RemoteClass]
public class SomeDataVO
{
public var id:int;
[Bindable]
public var label:String;
public function SomeDataVO()
{
}
}
}
ContentVO
package
{
[RemoteClass]
public class ContentVO
{
public var id:int;
[Bindable]
public var label:String;
[Bindable]
public var data:SomeDataVO;
public function ContentVO()
{
}
}
}