因此,我关注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的对象引用,而是比较项目的"产品"属性。