actionscript-3 - AS3 : How to know if dataprovider or its content(s) is changed

标签 actionscript-3 apache-flex dataprovider

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

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

  • 如果数据提供者被更改/分配。 (我可以做到……下面的第一种方法有效);
  • 如果 任何项目在 dataprovider 集合中发生了变化。

  • 我尝试了两种方法都没有成功...

    第一种方法:
            [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
            }
    

    第二种方法:

    因为这是基于 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
            }
    

    有任何想法吗?

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

    最佳答案

    如果您向我们展示一个可运行的示例来演示问题,我们将能够提供更多帮助。

    1. if the dataprovider is changed/assigned.


    您的第一种方法应该有效。你能告诉我们是什么让你认为它没有吗? (我假设没有跟踪声明?)。并告诉我们您为更改 dataProvider 做了什么。

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

    2 if any item in the dataprovider collection has changed.



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

    如果您可以控制项目的更改方式,则可以这样处理。代替:
    (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 以反射(reflect)最新的 dataProvider 数据。但是,如果您在下拉菜单打开时动态更改某些内容,我不希望它自动更新[如果您不更改 dataProvider.

    关于actionscript-3 - AS3 : How to know if dataprovider or its content(s) is changed,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4651860/

    相关文章:

    c# - 在 C# 中加密并在 Flex 中解密

    android - 将 flex 移动项目转换为 flex web 项目

    css - 使用 css 在文本 control.htmlText 中设置 <a> 标签和 <b> 标签的样式

    arrays - 在 AS3 中使用值数组初始化 Vector 是否会部分违背 Vector 的目的?

    actionscript-3 - 如何在 Windows 10 中安装 Flash 调试版本

    actionscript-3 - 将声音输出到耳机和扬声器

    mysql - 如何使用 MySQL 配置 MvcMusicStore .Net WebApp?

    actionscript-3 - 当多个静态 Sprite 添加到舞台时如何提高 swf 的性能?

    reactjs - React-admin:如何将更多参数传递给 GET_LIST 类型的 dataProvider

    apache-flex - Flex 数据网格排序不会跨数据提供者更改保留