我有一个包含可绑定对象的ArrayCollection。我想在下面的多个地方访问它们(为清晰起见,只有一个标签)。我怎样才能做到这一点?我应该为ArrayCollection调度特殊事件(哪个?)编写某种包装器,以便通过Flex事件机制捕获。
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
creationComplete="init()">
<mx:VBox>
<s:Label id="lb" text="{lab(col)}" />
<s:Button click="onC(event)" color="0x000000"/>
</mx:VBox>
<fx:Script>
<![CDATA[
import mx.collections.ArrayCollection;
import mx.events.CollectionEvent;
import mx.events.PropertyChangeEvent;
import spark.events.ListEvent;
[Bindable] private var col:ArrayCollection;
private function init():void {
col = new ArrayCollection();
col.addItem({ val: 1 });
col.addItem({ val: -1 });
}
private function onC(event:MouseEvent):void {
col.getItemAt(0).val++;
trace(col.getItemAt(0).val);
}
private function lab(_:ArrayCollection):String {
for(var i:int = 0; i < col.length; i++) {
if(col.getItemAt(i).val > 0)
return col.getItemAt(i).val.toString();
}
return "-666";
}
]]>
</fx:Script>
</s:Application>
我想创建这样的包装器:
public class BindableArrayCollection extends EventDispatcher {
[Bindable] private var _ac:ArrayCollection;
public function BindableArrayCollection() {
this.ac = new ArrayCollection();
}
[Bindable]
public function set ac(val:ArrayCollection):void {
if(_ac != null)
_ac.removeEventListener(CollectionEvent.COLLECTION_CHANGE, toggleChangeEvent);
_ac = val;
if(_ac != null)
_ac.addEventListener(CollectionEvent.COLLECTION_CHANGE, toggleChangeEvent);
toggleChangeEvent();
}
public function get ac():ArrayCollection {
return _ac;
}
public function toggleChangeEvent(_:Object = null):void {
dispatchEvent(....);
}
}
这样绑定机制就可以了。我应该放置什么而不是“......”?
答案 0 :(得分:1)
您的问题是标签没有显示您的ArrayCollection中的值,我是对的吗?是这样,因为Label
没有像DataGrid
或List
这样的ArrayCollection更新机制。
您的ArrayCollection是可绑定的,但这仅表示只有在更改lab(col)
变量值时才会执行col
函数。
您设置col = new ArrayCollection();
,此时执行绑定。只有在此之后,您才能为集合添加值。有两种方法可以解决这个问题:
lb.executeBindings()
以更新标签视图。CollectionEvent.COLLECTION_CHANGE
ArrayCollection调度。希望,这会对你有帮助。
答案 1 :(得分:0)
看起来你刚开始。我在这里看到的唯一可绑定的是ArrayCollection,而不是其中的对象。如果您想要在应用程序的任何位置访问集合(或一般的任何数据),那些客户端代码片段需要知道如何访问它。一种可能的方法是实现Singleton设计模式 - http://www.squidoo.com/flash-tutorials_as3-singleton-design-pattern这将是一个很好的起点,让您的数据更像“全局”。