我正在实现某种组合框控件(通过扩展 spark.components.supportClasses.DropDownListBase
)
现在,在这个控件里面;我需要知道:
我尝试了两种方法都没有成功...
第一种方法:
[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
}
有任何想法吗?
更新:上面已编辑。第一种方法让我知道数据提供者是否已更改,但如果数据提供者集合中的任何项目已更新,则不会。第二种方法根本不起作用..
最佳答案
如果您向我们展示一个可运行的示例来演示问题,我们将能够提供更多帮助。
- 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/