【问题标题】:Arraycollection not capturing the thrown event?Arraycollection 没有捕获抛出的事件?
【发布时间】:2009-08-04 17:44:44
【问题描述】:

我有一个对象集合,每个对象每次更新其值时都会引发一个事件。我试图通过向包含它的 arraycollection 添加一个侦听器来捕获该事件(参见主类),但它不起作用。老实说,我不确定这是正确的方法。

我避免使用 Collection.CHANGE,因为它陷入无限递归,最终以堆栈溢出结束。有什么想法吗?


[Bindable]
public class NamesVO {      
    public var steveList:ArrayCollection;   // array of SteveVO objects

    public function NamesVO() {
        steveList = new ArrayCollection();
    }       

    public function rename():void {
        for each(var steve:SteveVO in steveList) {  
            steve.rename();
        }           
    }
}   

[Bindable]
public class SteveVO extends EventDispatcher {
    public static const VALUE_CHANGED:String = "VALUE_CHANGED";

    public var code:String;
    public var name:String;
    public var _quantity:Number;

    public function SteveVO() {
        this.code = "";
        this.name = "";
        _quantity = 0;
    }

    public function get quantity():Number {
        return _quantity;   
    }

    public function set quantity(quantity:Number):void {
        _quantity = quantity;
        dispatchEvent(new Event(VALUE_CHANGED));    
    }

    public function rename():void {
        name = code + " - " + _quantity;
    }       
}   

Main class:

names = new NamesVO();
names.steveList.addEventListener(SteveVO.VALUE_CHANGED, function():void {
     names.rename();  // this anon function is not being executed!!
}); 

var steve:SteveVO = new SteveVO();
names.steveList.addItem(steve); 

// names is bound on a datagrid and uses itemeditor for each SteveVO object

【问题讨论】:

    标签: apache-flex actionscript-3 events listener dispatcher


    【解决方案1】:

    VALUE_CHANGED 事件不是由 steveList 数组 Collection 调度的,因此不会被您的侦听器检测到。您可以通过检测何时将项目添加到数组集合并向新的steveVO 对象添加从NamesVO 分派相同事件的侦听器,将您想要的功能封装在NamesVO 类中。然后在你的主类中监听那个事件。

    当一个数量更改时,是否有理由更改所有名称。在 steveVO 类的 set 函数中调用 rename 会更好吗?

    实施更改:

    import flash.events.Event;
    import mx.collections.ArrayCollection;
    import mx.events.CollectionEvent;
    import mx.events.CollectionEventKind;
    
    [Bindable]
    public class namesVO 
    {                  
        public var steveList:ArrayCollection;   // array of SteveVO objects       
        public function namesVO() 
        {                
            steveList = new ArrayCollection();
            steveList.addEventListener(CollectionEvent.COLLECTION_CHANGE,collChanged);   
        }
    
        private function collChanged(e:CollectionEvent):void
        {
            if (e.kind == CollectionEventKind.ADD)
            e.items[0].addEventListener(steveVO.VALUE_CHANGED,valueChanged);
        }                      
    
        private function valueChanged(e:Event):void
        {
            dispatchEvent(new Event(steveVO.VALUE_CHANGED));
        }
    
        public function rename():void 
        {                
            for each(var steve:steveVO in steveList) 
            {                              
                steve.rename();                
            }  
        }                             
    }
    

    在主类中使用:

    names = new namesVO();
    names.addEventListener(steveVO.VALUE_CHANGED, function():void 
    {     
        names.rename();  
    }); 
    
    steve = new steveVO();
    names.steveList.addItem(steve); 
    steve.quantity = 12;
    

    当然这只是一个例子,只包括一次添加一项的情况。

    【讨论】:

    • 当一个质量改变时,是否有理由改变所有名称。简单地在 steveVO 类的 set 函数中调用 rename 会更好吗? - 是的。名称只是一个例子。我计划添加百分比等字段。每次数量变化时,百分比也会根据给定的“总数量”而变化。
    • Collection.CHANGE 是我所知道的唯一检测arraycollection 变化的事件。我该如何实施?我试过 new Event(VALUE_CHANGED, true) // 冒泡,但也没有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-30
    • 2018-03-01
    • 2018-05-03
    • 2020-10-17
    • 2021-05-21
    • 2020-11-04
    • 1970-01-01
    相关资源
    最近更新 更多