Почему значение объекта Webcomponent распределяется между различными экземплярами одного и того же веб-компонента? - PullRequest
0 голосов
/ 28 февраля 2020

Я создал веб-компонент под названием TestElement с Polymer, как показано ниже. Он просто имеет значение объекта и функцию, которая добавляет значения к этому компоненту.

<dom-module id="test-element">
  <template>Test Element</template>

  <script>
    class TestElement extends Polymer.Element {
    static get is() { return "test-element"; }

    static get properties() {
      return {
        _myVar: {
          type: Object,
          value: {},
        },
      };
    }

    addNew(key, val) {
      this._myVar[key] = val;
    }
  }

  customElements.define(TestElement.is, TestElement);
</script>
</dom-module>

Я создал два экземпляра этого в родительском элементе следующим образом:

class ParentElement extends Polymer.Element {
  static get is() { return "parent-element"; }

  ready() {
    super.ready();
    this.$.myElement.addNew('key1', 'val-1');
    this.$.myElement2.addNew('key2', 'val2'); 
    console.log(this.$.myElement._myVar); // Expected to have {'key1': 'val-1'} but got {'key1': 'val-1', 'key2': 'val2'}. Why?
  }
}

В консоли Журнал выше, я ожидаю, что {'key1': 'val-1'}, но получил {'key1': 'val-1', 'key2': 'val2'}. Почему?

Если вы хотите иметь рабочий пример, пожалуйста, обратитесь к этому плану:

http://plnkr.co/edit/7jSwTTBbBxD4qCbUoCGI?p=preview

Ответы [ 2 ]

1 голос
/ 02 марта 2020

JavaScript объекты приведены по ссылке, и когда вы определяете значение по умолчанию, это отдельный объект.

static get properties() {
  return {
    _myVar: {
      type: Object,
      value: {},
    },
  };
}

Чтобы избежать этого, вы можете определить функцию , которая будет возвращать новый объект для каждого экземпляра компонента.

static get properties() {
  return {
    _myVar: {
      type: Object,
      value: function() { return {}; },
    },
  };
}
0 голосов
/ 29 февраля 2020

Обдумывая это, я нашел решение.

Тестовый элемент

Класс TestElement расширяет Polymer.Element {stati c get is () {return "test-element"; }

static get properties() {
  return {
    _myVar: {
      type: Object,
      value: {},
    },
  };
}

ready() {
  super();
  _myVar = {}; // if initialized like this, the objects are not shared anymore.
}

addNew(key, val) {
  this._myVar[key] = val;
}

}

customElements.define (TestElement.is, TestElement);

Итак, ниже записывается, что я ожидал:

class ParentElement extends Polymer.Element {
     static get is() { return "parent-element"; }

  ready() {
    super.ready();
    this.$.myElement.addNew('key1', 'val-1');
    this.$.myElement2.addNew('key2', 'val2'); 
    // Expected to have {'key1': 'val-1'} and got {'key1': 'val-1'} check! :)
    console.log(this.$.myElement._myVar); 
  }
}
...