通过P2P Flex发送ArrayCollections

时间:2011-11-24 06:11:17

标签: p2p arraycollection event-dispatching

我有关于flex的P2P问题。 使用P2P在两个应用程序之间传递数据时。我收到以下错误:

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


我花了几天时间使用Google尝试找到解决方案,但是无法摆脱这个错误。我已经尝试过使用ObjectUtils,直接赋值,并在括号内创建一个带有ObjectUtils的新ArrayCollection,但仍无法解决问题。


代码目的:
- >两个用户通过P2P连接 - > 1st 用户可以操作图片(存储为数组集合中的对象) - > 第一个用户将更新的ArrayCollection(带有更改的图片)发送到第二用户
- > 第二用户的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 个答案:

答案 0 :(得分:1)

我弄清楚问题是什么以及如何修复它 - 部分感谢这些页面:
Unable to Bind warning: class is not an IEventDispatcher
Flex Warning: Unable to bind to property 'foo' on class 'Object' (class is not an IEventDispatcher)

我知道信息已成功发送给其他对等方,但问题是对象INSIDE ArrayCollection不能被绑定。

我对这个问题的解决方案如下:

  • 创建循环,在ArrayCollection中发送每个对象以及索引,告诉您ArrayCollection中的值是什么流媒体。

  • 现在,由于您正在“流式传输”数据,因此使用 setItemAt()函数覆盖当前的ArrayCollection,并将第一个字段设置为“新的ObjectProxy(传递对象)“和第二个字段作为传递索引(注意): 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);
}