AS3:如何知道dataprovider或其内容是否已更改

时间:2011-01-10 21:45:43

标签: actionscript-3 flex dataprovider

我正在实施某种组合框控制(通过扩展spark.components.supportClasses.DropDownListBase

现在,在这个控件内;我需要知道:

  1. 如果更改/分配了数据提供者。 (我可以做......下面的第一种方法有效);
  2. 如果dataprovider集合中的任何项目已更改。
  3. 我尝试了两种没有做到这一点的方法......

    第一种方式:

            [Bindable("collectionChange")]
            override public function set dataProvider(value:IList):void
            {
                if (value) value.addEventListener(CollectionEvent.COLLECTION_CHANGE, onDataChange);
    
                super.dataProvider = value;
                trace("DATA CHANGED"); //fires
            }
    
            protected function onDataChange(event:CollectionEvent):void
            {
                trace("COLLECTION ITEM(S) CHANGED"); //does not fire
            }
    

    2ND APPROACH:

    因为这是基于DropDownListBase;它应该已经发送CollectionEvent.COLLECTION_CHANGE事件..?

            public function myClass() //constructor
            {
                addEventListener(CollectionEvent.COLLECTION_CHANGE, onDataChange);
            }
    
            protected function onDataChange(event:CollectionEvent):void
            {
                trace("DATA CHANGED"); //does not fire
            }
    

    有什么想法吗?

    更新:上面编辑..第一种方法让我知道数据提供者是否被更改,但是如果在dataprovider集合中更新了任何项目则不知道。第二种方法根本不起作用..

1 个答案:

答案 0 :(得分:1)

如果您向我们展示可运行的样本以证明问题,我们将能够提供更多帮助。

  
      
  1. 如果数据提供者是   改变/分配。
  2.   

你的第一种方法应该有效。你能告诉我们你认为它没有的原因吗? (我假设没有跟踪声明?)。并告诉我们您为更改dataProvider所做的工作。

第二种方法不起作用,因为myClass没有触发collectionChange事件。

  

2,如果dataprovider集合中的任何项目已更改。

没有办法告诉这个。在大多数情况下,集合只是指向其他对象的指针列表。如果更改这些指针,则会触发collectionChange事件。如果您更改指针指向的项目,则集合无法知道某些内容已更改。如果您的MXML粉丝,绑定的工作方式非常相似。

如果您可以控制项目的更改方式,则可以通过这种方式处理。而不是:

(collection.getITemAt(x) as myObject).property = newValue;

做这样的事情:

  var myObject : MyObject = collection.getITemAt(x) as myObject
  myObject.property = newValue;
  collection.setItemAt(x, myObject);

我希望能解雇collectionChange事件,而不是前者。

也就是说,在dropDownListBase的上下文中:当您滚动或打开并关闭下拉列表时,应该更新itemRenderers以反映最新的dataProvider数据。但是如果你在下拉打开时动态改变了某些东西,我不希望它自动更新[如果你没有改变dataProvider。