そのため、コンテキストについては、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)
}
}
問題は、この関数を使用すると、アイテムの数量が更新されないことです。次に、2 つの製品の 1 つのエントリが必要なときに、1 つの製品の 2 つのエントリを持つショッピング カートがあります。inCart ブール値をトレースすると、何をしても「false」になります。最初の関数は正常に機能し、期待どおりに機能するため、データが正しく更新されない理由がわかりません。また、$items.refresh();
2 番目の関数 (ソート用) の最後で呼び出すと、NullPointerException error.
もう 1 つ注意すべき点は、4.6.0 を使用しているときに Flex 4 用の本を使用していることです。SDK は、Apache に提供される前の最後の Adobe リリースです。これが重要かどうかはわかりません。
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();
}