ArrayCollection包装器允许绑定机制查看更改

时间:2011-07-26 12:21:22

标签: flex events binding label arraycollection

我有一个包含可绑定对象的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(....);
    }
}

这样绑定机制就可以了。我应该放置什么而不是“......”?

2 个答案:

答案 0 :(得分:1)

您的问题是标签没有显示您的ArrayCollection中的值,我是对的吗?是这样,因为Label没有像DataGridList这样的ArrayCollection更新机制。
您的ArrayCollection是可绑定的,但这仅表示只有在更改lab(col)变量值时才会执行col函数。
您设置col = new ArrayCollection();,此时执行绑定。只有在此之后,您才能为集合添加值。有两种方法可以解决这个问题:

  1. 致电lb.executeBindings()以更新标签视图。
  2. 在更改项目时,听取CollectionEvent.COLLECTION_CHANGE ArrayCollection调度。
  3. 希望,这会对你有帮助。

答案 1 :(得分:0)

看起来你刚开始。我在这里看到的唯一可绑定的是ArrayCollection,而不是其中的对象。如果您想要在应用程序的任何位置访问集合(或一般的任何数据),那些客户端代码片段需要知道如何访问它。一种可能的方法是实现Singleton设计模式 - http://www.squidoo.com/flash-tutorials_as3-singleton-design-pattern这将是一个很好的起点,让您的数据更像“全局”。