【问题标题】:AS3: How to know if dataprovider or its content(s) is changedAS3:如何知道数据提供者或其内容是否已更改
【发布时间】:2011-01-10 21:45:42
【问题描述】:

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

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

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

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

第一种方法:

        [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
        }

有什么想法吗?

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

【问题讨论】:

    标签: actionscript-3 apache-flex dataprovider


    【解决方案1】:

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

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

    您的第一种方法应该有效。你能告诉我们是什么让你认为它没有吗? (我假设没有跟踪声明?)。并告诉我们您为更改 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.

    【讨论】:

    • myClassInstance.dataprovider = someArrCollection; //这可行.. 但是 myClassInstance.dataprovider[0].name = "john"; //不会触发collectionChange事件。有没有办法知道集合项的属性何时更改?这样我就可以更新我的组合列表标签..
    • 因为 dataProvider 属性是 [Bindable("collectionChange")];我认为所有者类应该触发一个 collectionChange 事件。
    • @Radgar 回答你的第一个问题,我不知道。当某些事情发生变化时,您通常可以使某些内容无效以触发更新;但组件或集合中的任何内容都不知道。 [Bindable('collectionChange')] 并不一定意味着所有者类会触发 collectionChange 事件,但您绝对可以在组件或其父级中查找该事件以查看它是否触发以及何时触发。
    猜你喜欢
    • 2015-03-28
    • 2011-08-28
    • 1970-01-01
    • 1970-01-01
    • 2019-07-05
    • 1970-01-01
    • 1970-01-01
    • 2017-03-23
    • 1970-01-01
    相关资源
    最近更新 更多