0

我有一个对象集合,每个对象每次更新其值时都会引发一个事件。我试图通过向包含它的 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
4

1 回答 1

0

VALUE_CHANGED事件不是由 steveList 数组 Collection 调度的,因此您的侦听器不会检测到该事件。您可以NamesVO通过检测何时将项目添加到数组集合并将侦听器添加到steveVONamesVO. 然后在你的主课上听那个事件。

更改一个数量时是否有理由更改所有名称。简单地在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;

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

于 2009-08-04T18:57:41.347 回答