Значение свойства объекта не изменяется в локальном хранилище в Ember - PullRequest
3 голосов
/ 04 февраля 2020

Я строю магазин в Ember со списком товаров, которые добавляются в Local Storage, когда пользователь нажимает кнопку add to cart . Каждый продукт - это объект со свойством ordered_quantity, я пытаюсь изменить значение этого свойства, когда пользователь пытается удалить продукт из корзины. (пример: ordered quantity: 8, при нажатии кнопки это должно быть 7).

В моем служебном файле есть следующий код:

remove(item) {
  let new_arr = this.get('items');
  let elementIndex = new_arr.findIndex(obj => {
    return obj.id === item.id;
  });

  if (elementIndex !== -1) {
    new_arr[elementIndex].ordered_quantity = new_arr[elementIndex].ordered_quantity - 1;
  } 
  this.set('cart.items', new_arr);
}

Я использую надстройку Local Storage (https://github.com/funkensturm/ember-local-storage#methods)

и у меня есть следующее действие:

actions: {
  removeFromCart(){
    this.get('cart').remove(this.product);
  }
}

Когда я пытаюсь запустить следующий код, я получаю сообщение об ошибке:

Uncaught Error: Assertion Failed: Вы попытались обновить [ object Object] .ordered_quantity в "7", но он отслеживается контекстом отслеживания, таким как шаблон, вычисляемое свойство или наблюдатель. Чтобы убедиться, что контекст обновляется правильно, вы должны сделать свойство недействительным при его обновлении. Вы можете пометить свойство как @tracked или использовать @ember/object#set для этого.

Я пытался использовать функцию set следующим образом:

let updated = item.ordered_quantity - 1;
set(item, 'ordered_quantity', updated);

https://api.emberjs.com/ember/release/functions/@ember%2Fobject / set , и код работал без ошибок, как ожидалось, но значение моего свойства ordered_quantity не было обновлено в локальном хранилище.

1 Ответ

4 голосов
/ 04 февраля 2020

Вам необходимо адаптировать функцию set к вашему сценарию использования:

remove(item) {
  let new_arr = this.get('items');
  let elementIndex = new_arr.findIndex(obj => {
    return obj.id === item.id;
  });

  if (elementIndex !== -1) {
    set(new_arr[elementIndex], 'ordered_quantity', new_arr[elementIndex].ordered_quantity - 1);
  } 
  this.set('cart.items', new_arr);
}
...