Спасибо, что прочитали меня. Извините за мой английский и мой вопрос может быть глупым. Собираю корзину для интернет-магазина. Я пытаюсь получить данные из продуктов, отображаемых для создания списка заказов. Корзина — это объект с 3 равными методами для добавления количества, имени и цены. Но только одна работа. Два других перезаписывают данные.
Данные, которые я хочу хранить, представляют собой строки.
var Cart = function () {
this.cartListQte = {}
this.products_names = {}
this.products_prices = {}
}
//сорт
Cart.prototype = {
//properties
'cartListQte': {},
'products_names': {},
'products_prices': {},
//methods
//setter getter
setCartListQte: function (cartListQte) {
this.cartListQte = cartListQte;
},
getCartListQte: function () {
return this.cartListQte;
},
setProducts_names: function (products_names) {
this.products_names = products_names;
},
getProducts_names: function () {
return this.products_names;
},
setProducts_prices: function (products_prices) {
this.products_prices = products_prices;
},
getProducts_prices: function () {
return this.products_prices;
},
//"push" new product
pushed: function (productId,Qty){
this.cartListQte[parseInt(productId)]= parseInt(Qty);
},
pushName: function (productId,nm){
this.products_names[parseInt(productId)]= nm;
},
pushPrice: function (productId,prx){
this.products_prices[parseInt(productId)]= parseInt(prx);
}
}
//жест дю панье
функция addProductToCart (событие) {
//nouveau panier
var cart = new Cart;
//on récupère le panier déjà enregisté
var curentCart = JSON.parse(localStorage.getItem('panier'));
//si il existe, on le manipule
if (curentCart != null){
cart.cartListQte = curentCart.cartListQte;
}
//récupération des nouvelles données à enregistrer
var id = $(this).attr('productid');
var quantity = $("[productIdQte = "+id+"]").val();
console.info(quantity);
var name = String($(".name"+id).text());
console.info(name);
var price = $(".price"+id).text();
console.info(parseInt(price));
//poussées dans le tableau
if (quantity>0){
/* exemple who don't work too
var quantity = "1";
var name = "a";
var price = "1" ;
*/
cart.pushed(id, quantity);
cart.pushName(id, name);
cart.pushPrice(id, price);
//écrasement des données dans le local
localStorage.setItem('panier', JSON.stringify(cart));
console.info(cart.cartListQte);
}
Я ожидаю вывод
cart {
cartListQte: Object { 5: 4, 6: 3 }
products_names: Object { 5: "toto", 6: "titi" }
products_prices: Object { 5: 100, 6: 150 }
}
но фактический результат
cart {
cartListQte: Object { 5: 4, 6: 3 }
products_names: Object { 6: "titi" }
products_prices: Object { 6: 150 }
}
Ожидая некоторых обновлений, если вы хотите, чтобы это поведение { 5: "tata", 6: 150 } в свойстве цены вместо этого { 5: null, 6: 150 }, измените "parseInt (prx)" в "parseInt (prx ) ?parseInt(prx): prx";
Извините, я не видел ваш комментарий :s. Я здесь впервые...
может быть, проблема в передаче по ссылке или передаче по значению?
Проблема в том, что вы заменяете контент в объектах.
setProducts_names: function (products_names) {
this.products_names = products_names;
// all names are replaced with one actuall setting
},
поэтому код необходимо обновить с помощью оператора с тремя точками, который копирует все атрибуты в ранее сохраненном объекте.
setProducts_names: function (products_names) {
this.products_names = {...this.products_names,...products_names};
// products_names will be merged
},
Это необходимо добавить к каждому методу set...
На самом деле это не должно работать, потому что методы set в этом конкретном случае никогда не запускаются: @Gauthier с методами push изменяет только один элемент массива, поэтому массив устанавливается только в первый раз, и его экземпляр никогда не изменяется.
да мне не нужны сеттеры. Волшебная мысль заключается в том, что работает первый метод, а не второй и третий... С тем же значением и тем же синтаксисом это очень странно.
@ Готье, как я сказал в комментарии к вашему вопросу, ваш прототип верен (вы можете видеть это из этого стекблиц). Вы должны показать нам, как вы меняете идентификаторы, имена и цены, прежде чем добавлять их в объект корзины.
Извините, ребята, когда я отвечал на это, была только часть кода :)
Ну вот, это должно сработать. Вы забыли обновить 2 других массива.
if (curentCart != null){
cart.cartListQte = curentCart.cartListQte;
cart.products_names = curentCart.products_names;
cart.products_prices = curentCart.products_prices;
}
Нет проблем ;). Я думаю, что принято думать, что проблема больше, чем она есть на самом деле. На этом этапе лучше спросить второе мнение :).
Ваш код правильный, возможно, где-то еще что-то не так. Не могли бы вы добавить фрагмент, где вы создаете корзину объектов и меняете идентификаторы, цены и имена? Кстати, вы должны ожидать product_prices как { 5: null, 6: 150 }, потому что parseInt не может решить «tata» в методе pushPrice.