Отправка ArrayCollections через P2P Flex - PullRequest
1 голос
/ 24 ноября 2011

У меня вопрос по поводу P2P с flex. При передаче данных между двумя приложениями используется P2P. Я получаю следующую ошибку:

 warning: unable to bind to property 'piece' on class 'Object' (class is not an IEventDispatcher)


Я провел несколько дней, используя Google, чтобы попытаться найти решение, но не могу избавиться от этой ошибки. Я попытался использовать ObjectUtils, прямое назначение и создать новую коллекцию ArrayCollection WITH ObjectUtils внутри круглых скобок и до сих пор не могу решить эту проблему.


Назначение кода:
-> Два пользователя подключаются через P2P
-> 1-й пользователь может манипулировать изображениями (хранятся как объекты в коллекции массивов).
-> 1-й пользователь отправляет обновленную коллекцию ArrayCollection (с измененными изображениями) пользователю 2-й
-> 2nd Пользователь ArrayCollection обновляется и теперь видит манипулированные картинки

Что касается моих знаний о Flex (довольно новых для него), я правильно связал то, что нужно было связать. Используя всплывающие окна и трассировку, я смог увидеть, что данные из ArrayCollection правильно копируются, но просто не хотят отображаться.


Вот некоторые фрагменты моего кода:

[Bindable]
public var taken:ArrayCollection = new ArrayCollection ([
    new picLayout(1,'sky.png'),
    new picLayout(2,'bird.png')
    ])

public function receiveSomeData(pass:ArrayCollection):void
{   
    // Want to replace current version of variable "taken" with
    // the one passed in using P2P
    this.taken= new ArrayCollection(pass.source);
}

public function sendSomeData(free:ArrayCollection):void
{   
    sendStream.send("receiveSomeData",free);
}

<s:Button click="sendSomeData(taken)" label="Update" />

Спасибо за вашу помощь и время!

1 Ответ

1 голос
/ 25 ноября 2011

Я выяснил, в чем проблема и как ее исправить - с частичной благодарностью за эти страницы:
Невозможно связать предупреждение: класс не является IEventDispatcher
Предупреждение Flex: невозможно связать со свойством 'foo' в классе 'Object' (класс не является IEventDispatcher)

Я знал, что информация была успешно отправлена ​​другому узлу, но проблема заключалась в том, что объекты INSIDE ArrayCollection не были привязаны.

Мое решение проблемы было следующим:

  • Создайте цикл , который отправляет каждый объект в ArrayCollection вместе с index , который сообщает вам, какое значение в ArrayCollection вы используете для потоковой передачи.

  • Теперь, поскольку вы «потоковые» данные, перезапишите текущую коллекцию ArrayCollection, используя функцию setItemAt () с полем first как " new ObjectProxy (passObject)"и поле second как sentIndex (Примечание): функция ObjectProxy () заставляет переданный объект быть Привязываемое .


Вот обновленный фрагмент моего кода:

[Bindable]
public var takenPics:ArrayCollection = new ArrayCollection ([
    new picLayout(1,'sky.png'),
    new picLayout(2,'bird.png')
    ])

private function sendSomeData(data:Object, index:int):void
{   
    sendStream.send("receiveSomeData",data,index);
}

private function receiveSomeData(passedPic:Object,ix:int):void
{   
    // ObjectProxy needed to force a bindable object
    takenPics.setItemAt(new ObjectProxy(passedPic),ix);
}

public function sendPictures():void
{
    // ix < 2 because size of ArrayCollection is 2
    for (var ix:int = 0; ix<2; ix++)
        sendSomeData(takenPics[ix],ix);
}
...