2016-05-31 12 views
0

を持ってjQueryのカート機能は、私がこのJSFiddle持っているいくつかのわずかな問題

  • 私はカートに追加すると、それが正常に動作しますが...私が別の商品を追加すると、カートアイテムをSKUで更新してQTYを増やすのではなく、新しいアイテムとして追加します
  • カートのカート額と価格を更新しますbあなたが変わっていない別のものを追加したら、私はこれを更新して解決することに苦労しています。 @MikeCが指摘
+0

'product'はオブジェクトでありインデックスではありません。ちょうど 'if(product.sku === sku)'を実行してください。また、 'product.sku'を' sku'に割り当てることには、あなたがすでにif条件で同じであることを確立しているので、何のポイントもありません。 –

+0

@MikeC:jQueryの最初のパラメータはインデックスだと思います。 –

+0

@squintダング、そうです。それは他のすべてから後方にある。さて、「sku」を再割り当てすることについてのビットは依然として立っています。 –

答えて

1

として、あなたはskuてオブジェクトを見つけることが、その後がない実際の変化をもたらしたことをプロパティに一致するskuを割り当てました。

代わりにqtyを更新したようです。

また、returnステートメントは$.eachコールバックの内側にあるため、$.each以下のコードは実行されません。

ECMAScript 6には、多くの新しいArrayメソッドが用意されています。その1つは.find()です。私はそれを使用して、配列内のオブジェクトを探し、それが見つかった場合はそれを更新するか、そうでなければ新しい項目をプッシュすることをお勧めします。

function addToBasket(title, sku, price, image, qty) { 
    // update sku if product is already present 
    var product = basket.find(function (prod) { 
    return prod.sku === sku 
    }) 

    if (product) { // found an object, so update it with the new quantity 
    product.qty = qty 

    } else { // no object found, so create a new object 
    basket.push({ title: title, sku: sku, price: price, image: image, qty: qty }); 
    } 

    saveBasket(); 
} 

.find()へのコールバックの戻り値は、配列内の現在のアイテムは、あなたがしたい1であるか否かを判定する。 true(または真実の値)を返すと、反復が停止し、そのオブジェクトが返されます。真理値を返す項目がなければ、undefinedが返されます。

ループの後、オブジェクトが見つかった場合は更新し、そうでなければ新しいオブジェクトを作成します。


旧式のブラウザには、.find()をパッチする必要があります。私がリンクしているMDNドキュメントには、ポリフィルがあります。

+0

事前に助けてくれてありがとう!私はちょうどそれを行った...それは予想通りにバブルの価格と量を更新する...私はミニカーを見るためにリフレッシュし、それが表示されますが、私はその後、バスケットに追加すると再び動作しないと私はコンソールで見る:定義されていない - 任意のアイデア?おかげで再び仲間! – James

+0

@James: 'prod'はコールバック内でのみ利用可能です。それがエラーの場合は、 'basket'に空の(null/undefined)項目があるかもしれません。 ... 'return prod && prod.sku === sku'を試してください –

+0

私は前にprodを使いませんでした。配列内のすべてがproductで、次にproduct.image、product.sku、product.price、product.qtyなどがあります。 – James

関連する問題