0

そのため、コンテキストについては、Michael Labriola、Jeff Tapper、Matthew Boles による本 Adob​​e 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)
   }
}

問題は、この関数を使用すると、アイテムの数量が更新されないことです。次に、2 つの製品の 1 つのエントリが必要なときに、1 つの製品の 2 つのエントリを持つショッピング カートがあります。inCart ブール値をトレースすると、何をしても「false」になります。最初の関数は正常に機能し、期待どおりに機能するため、データが正しく更新されない理由がわかりません。また、$items.refresh();2 番目の関数 (ソート用) の最後で呼び出すと、NullPointerException error.

もう 1 つ注意すべき点は、4.6.0 を使用しているときに Flex 4 用の本を使用していることです。SDK は、Apache に提供される前の最後の Adob​​e リリースです。これが重要かどうかはわかりません。

ShoppingCartItem のコードは次のとおりです。

    [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. による詳細情報のリクエスト。

Product.as クラス:

[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 ソート sortfield は、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();
    }
4

1 に答える 1