Как искать изменения в Map (), когда элемент установлен или удален? - PullRequest
2 голосов
/ 13 апреля 2019

Я настраиваю класс для добавления товаров в корзину. Элементы корзины хранятся в карте (). Теперь я хочу сохранить элементы в виде файлов cookie, каждый раз, когда карта меняется. Поэтому, когда я вызываю map.set () или map.delete (), я хочу запустить функцию сохранения. Но я хочу, чтобы это вызывалось автоматически не в каждой строке кода, где происходит «изменение материала».

Я уже пытался использовать прокси, но так как мне нужно поддерживать хотя бы IE11, я не могу его использовать.

import Product from "./product";


export default class Cart {
  constructor() {
    this.items = new Map();

  }

  watchForChanges(id) {
    // watch if this.item is changed
    // call saveItem if is changed
  }

  saveItem () {
    // save item

  }

  addItem(id, count, callback) {
    if (this.items.has(id)) {
      this.items.get(id).count += count;  
      callback( this.items.get(id) );
      return true;
    }

    this.newItem(id, count, callback);

  }

  newItem(id, count, callback) {
    let product = new Product(id);
    product.then((resolvedProduct) => {
      this.items.set(id, {} = resolvedProduct );
      this.watchForChanges(id);
      callback(this.items.get(id));
    }).catch((reject) => {
      Error("Network Error")
    });
  }


  removeItem(id, count = this.items.get(id).count, callback) {

    if (!this.items.has(id)) return false;

    let newCount = this.items.get(id).count -= count;
    if (newCount <= 0) this.items.delete(id);

    callback();

  }
//some more functions



}

Прямо сейчас я могу вызывать saveItem () каждый раз, когда что-то меняю. Как я могу создать что-то вроде eventListener для установки и удаления элементов в Map ();

1 Ответ

0 голосов
/ 13 апреля 2019

После некоторого исследования: я обнаружил, что у babel нет полифилов для расширения встроенных классов, таких как https://babeljs.io/docs/en/caveats/#classes

class MyMap extend Map {
//...
}

Сейчас я делаю функцию для прототипа Map () и вызовафункция сохранения ... не очень хорошо, но она работает ...

constructor() {

    this.items = new Map();
    let onupdate = this;
    Map.prototype.setItem = function (key, val) {
      this.set(key, val);
      onupdate.saveItem();
      return true;
    }

    Map.prototype.deleteItem = function (key,) {
      this.delete(key);
      onupdate.saveItem();
      return true;
    }


  }
...