1

所以我正在使用一个具有活动元素的数据表。当该活性元素发生变化时,我将活性元素的名称存储在我的聚合物元素的属性中。然后我在一个 div 中显示这个 String 属性。现在我确定属性更改有效,因为我在更改后 console.log 它,显示属性的 div 不会更新并不断显示我设置的默认值。

export class ProjectsOverview extends PolymerElement {
  static get template() {
      return html`
         ...
         <div>{{currentProject}}</div>
         ...
      `
  }

  static get properties() {
      return {
        currentProject: {
          type: String,
          value: "placeholder",
          notify: true,
          reflectToAttribute: true
        }
      };
  }

  connectedCallback() {
      super.connectedCallback();

      const grid = this.shadowRoot.querySelector('vaadin-grid');

      grid.addEventListener('active-item-changed', function(event) {
        const item = event.detail.value;

        grid.selectedItems = [item];
        if (item) {
          this.set('currentProject', item.name);
        } else {
          this.set('currentProject', '');
        }
        console.log(this.currentProject);
      });
  }
}

我的预期结果是,每次更新 currentProject 属性时,显示属性的 div 也会更新。

4

2 回答 2

2

active-item-changed回调没有将其上下文绑定到 Polymer 实例(即,是this网格而不是 Polymer 组件)。代替函数表达式,使用箭头函数自动绑定this到正确的上下文。

// grid.addEventListener('active-item-changed', function(event) { // DON'T DO THIS
grid.addEventListener('active-item-changed', (event) => {
  /* this is the Polymer instance here */
  this.set('currentProject', ...);
})
于 2019-05-30T08:35:13.050 回答
2

你的范围是错误的。您正在使用匿名函数,因此当您尝试设置currentProject时,您会在您this的匿名函数中执行此操作。用于.bind(this)解决您的问题。


grid.addEventListener('active-item-changed', function(event) {
        const item = event.detail.value;

        grid.selectedItems = [item];
        if (item) {
          this.set('currentProject', item.name);
        } else {
          this.set('currentProject', '');
        }
        console.log(this.currentProject);
      }.bind(this));
于 2019-05-30T08:35:58.497 回答