Flex-ArrayCollection中的游标搜索不起作用



因此,我关注Michael Labriola、Jeff Tapper和Matthew Boles的《Adobe Flex 4 Training From the Source》一书。

我正在构建一个购物车类,它从mxml接收ShoppingCartItem对象(它只是一个POAO),并通过以下公共函数将其添加到ArrayCollection:

private var $items:ArrayCollection = new ArrayCollection();
public function addItem(item:ShoppingCartItem):void
    {
        var inCart:Boolean = false;
        var currentItem:ShoppingCartItem;
        for(var i:int = 0; i < $items.length; i++)
        {
            currentItem = $items.getItemAt(i) as ShoppingCartItem;
            if(item.$product == currentItem.$product)
            {
                inCart = true;
                break;
            }
        }
        if(inCart)
        {
            currentItem.$quantity++;
        }
        else
        {
            $items.addItem(item);
        }
        updateTotal();
        $items.refresh();
    }

根据这本书,IViewCursor也可以实现同样的功能,就像这样。

public function addItem(item:ShoppingCartItem):void
{
   var cursor:IViewCursor = $items.createCursor();
   var inCart:Boolean = cursor.findFirst(item);
   if(inCart)
   {
      var existing:ShoppingCartItem = cursor.current as ShoppingCartItem;
      existing.$quantity++;
   }
   else
   {
      $items.addItem(item)
   }
}

问题是,当我使用此功能时,项目数量永远不会更新。然后我有一个购物车,里面有1个产品的2个条目,而我应该有2个产品的1个条目。无论我做什么,跟踪inCart布尔值都会产生"false"。第一个函数正常工作,正如预期的那样,所以我不知道为什么数据没有正确更新。此外,如果我在第二个函数(用于排序)的末尾调用$items.refresh();,它会抛出一个NullPointerException error.

另一件需要注意的事情是,当我使用4.6.0时,我正在使用一本Flex 4的书。SDK,在它被赠送给Apache之前的最后一个Adobe版本。我不知道这是否重要。

这是购物车项目的代码:

    [Bindable]
public class ShoppingCartItem
{
    public var $product:Product;
    public var $quantity:uint;
    public var $subtotal:Number;
    public function getSubTotal():Number
    {
        calculateSubTotal();
        return $subtotal;
    }
    public function toString():String
    {
        return "[ShoppingCartItem]"+$product.prodName+":"+$quantity;
    }
    public function calculateSubTotal():void
    {
        this.$subtotal = $product.listPrice*$quantity;
    }
    public function squeak():void
    {
        trace("squeak");
    }
    public function ShoppingCartItem(product:Product, quantity:uint = 1)
    {
        this.$product = product;
        this.$quantity = quantity;
        calculateSubTotal();
    }

编辑:更多信息由Sunil D.请求

产品类别:

[Bindable]
public class Product
{
    public var catID:Number;
    public var prodName:String;
    public var unitID:Number;
    public var cost:Number;
    public var listPrice:Number;
    public var description:String;
    public var isOrganic:Boolean;
    public var isLowFat:Boolean;
    public var imageName:String;
    public function toString():String
    {
        return "[Product]"+this.prodName;
    }
    public static function buildProductFromAttributes(data:XML):Product
    {
        var p:Product;
        var isOrganic:Boolean = (data.@isOrganic == "Yes");
        var isLowFat:Boolean = (data.@isLowFat == "Yes");
        p = new Product(data.@catID,
                        data.@prodName,
                        data.@unitID,
                        data.@cost,
                        data.@listPrice,
                        data.@description,
                        isOrganic,
                        isLowFat,
                        data.@imageName);
        return p;
    }
    public static function buildProduct(o:Object):Product
    {
        var p:Product;
        p = new Product(o.catId,o.prodName,o.unitID,o.cost,o.listPrice,
                        o.description,(o.isOrganic == 'true'),
                       (o.isLowFat == 'true'),o.imageName);
        return p;
    }
    public function Product(cid:Number, name:String, uid:Number, cost:Number, listp:Number, desc:String, iso:Boolean, ilf:Boolean, imn:String)
    {
        this.catID = cid;
        this.prodName = name;
        this.unitID = uid;
        this.cost = cost;
        this.listPrice = listp;
        this.description = desc;
        this.isOrganic = iso;
        this.isLowFat = ilf;
        this.imageName = imn;
    }
}

ArrayCollection排序排序字段是ShoppingCartItem类中包含的产品POAO。它是在ShoppingCart的构造函数中完成的,如下所示:

public class ShoppingCart
{
    [Bindable]
    private var $items:ArrayCollection = new ArrayCollection();
    public function ShoppingCart()
    {
        var prodSort:Sort = new Sort();
        var sortField:SortField = new SortField("product");
        prodSort.fields =[sortField];
        $items.sort = prodSort;
        $items.refresh();
    }

viewcursor方法不起作用的原因是项目(ShoppingCartItem)不在$items集合中。此方法比较对象引用,因此如果您的项目是ShoppingCartItem的另一个实例,则找不到它。

在第一种方法中,您不是比较ShoppingCartItem的对象引用,而是比较项目的"产品"属性。

相关内容

  • 没有找到相关文章

最新更新