2013-08-05 1 views
0

Donc je suis le livre Adobe Flex 4 Formation de la source par Michael Labriola, Jeff Tapper et Matthew Boles, pour le contexte.Flex - La recherche par curseur dans ArrayCollection ne fonctionne pas

Je construis un panier de classe qui reçoit un objet ShoppingCartItem (qui est juste un POAO) de la MXML et il ajoute à une ArrayCollection via cette fonction publique:

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(); 
    } 

Selon le livre, la même fonction peut être obtenue avec un IViewCursor, comme ceci.

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) 
    } 
} 

Le problème est que lorsque j'utilise cette fonction, la quantité de l'article n'est jamais mise à jour. Ensuite, j'ai un panier avec 2 entrées de 1 produit quand je devrais avoir 1 entrée de 2 produits. Tracer le booléen inCart donne "faux", peu importe ce que je fais. La première fonction fonctionne correctement et comme prévu, donc je n'ai aucune idée pourquoi les données ne sont pas mises à jour correctement. En outre, si j'appelle $items.refresh(); à la fin de la deuxième fonction (pour le tri), il jette un NullPointerException error.

Une autre chose à noter est que j'utilise un livre pour Flex 4 lorsque j'utilise le 4.6.0 . SDK, la dernière version d'Adobe avant d'être offerte à Apache. Je ne sais pas si c'est important.

Voici le code pour 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(); 
    } 

EDIT: Plus Demande d'information par Sunil D.

classe 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 = ([email protected] == "Yes"); 
     var isLowFat:Boolean = ([email protected] == "Yes"); 
     p = new Product([email protected], 
         [email protected], 
         [email protected], 
         [email protected], 
         [email protected], 
         [email protected], 
         isOrganic, 
         isLowFat, 
         [email protected]); 
     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 le tri est le Produit POAO contenu dans la classe ShoppingCartItem. Il est fait dans la fonction constructeur de ShoppingCart comme ceci:

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(); 
    } 
+1

Pouvez-vous afficher le code qui définit le tri de la collection? Le [documentation] (http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/mx/collections/IViewCursor.html#findFirst()) indique que les propriétés que vous triez doivent être trouvées dans l'élément que vous ' re recherche. Sur quelle (s) propriété (s) travaillez-vous? La propriété sort est-elle un type primitif (String, int, etc.) ou POAO comme votre classe 'Product'? Cette exception de pointeur nul que vous obtenez en essayant de trier est probablement un indice, sur quel numéro de classe/ligne cela se passe-t-il? +1 pour l'utilisation d'un 'IViewCursor' (personne ne semble jamais en profiter). –

+0

Édité avec plus d'informations comme demandé @SunilD. Le 'NullPointerException' est retourné à la fin de la recherche de curseur, quand j'essaye d'appeler la fonction d'actualisation de ArrayCollection dans $ items. –

Répondre

-1

La raison pour laquelle l'approche viewcursor ne fonctionne pas parce que l'élément (ShoppingCartItem) ne sont pas dans la collection $ items. Cette méthode compare les références d'objet et ne trouvera donc pas votre article s'il s'agit d'une autre instance de ShoppingCartItem.

Dans la première approche, vous ne comparez pas les références d'objet de ShoppingCartItem, mais comparez la propriété "product" des éléments.

Questions connexes