Компоненты MDC-Select не имеют проблемы с маркировкой - PullRequest
0 голосов
/ 07 февраля 2019

Я - младший разработчик и работаю над компонентами MDC. У меня вопрос: MDC-Select не всплывает надписью, когда я динамически добавляю новый элемент в его список.Это работает отлично, если я передам массив списков и не буду им манипулировать, но когда я добавляю элемент в его список элементов и выбираю этот новый элемент, он не всплывает на его метке.В результате метка и новое выбранное значение отображаются поверх друг друга, это выглядит как сбой.

Я предположил, что может быть проблема состояния гонки, при обновлении индекса нового элемента и при выборе этого нового элемента онпутать или я нажимаю, пока он все еще обновляет индекс нового элемента.Потому что мое временное решение ждет 600 секунд и добавляет CSS-класс для увеличения надписи, но, конечно, оно меня не удовлетворило, и я не думаю, что это правильное решение.Я не мог понять очень ясно.Я проверил учетную запись Github на компонентах MDC, увидел некоторые проблемы, похожие на мои, но решение не было тем, которое я искал.

      .mdc-select__label {
        left: 0;
        right: initial;
        position: absolute;
        bottom: 8px;
        left: 0;
        -webkit-transform-origin: left top;
        transform-origin: left top;
        -webkit-transition: -webkit-transform 180ms cubic-bezier(0.4, 0, 0.2, 1);
        transition: -webkit-transform 180ms cubic-bezier(0.4, 0, 0.2, 1);
        transition: transform 180ms cubic-bezier(0.4, 0, 0.2, 1);
        transition: transform 180ms cubic-bezier(0.4, 0, 0.2, 1), -webkit-transform 180ms cubic-bezier(0.4, 0, 0.2, 1);
        pointer-events: none;
        will-change: transform;
      }

      [dir="rtl"] .mdc-select__label,
      .mdc-select__label[dir="rtl"] {
        left: initial;
        right: 0;
      }

      .mdc-select[dir="rtl"] .mdc-select__label,
      [dir="rtl"] .mdc-select .mdc-select__label {
        -webkit-transform-origin: right top;
        transform-origin: right top;
      }

      .mdc-select__label--float-above {
        -webkit-transform: translateY(-100%) scale(0.75);
        transform: translateY(-100%) scale(0.75);
      }


<div id="root" class\$="mdc-select mdc-select--box mdc-menu-anchor [[addClass]]" role="listbox">
      <div id="surface" class\$="mdc-select__surface [[_error(error)]]" tabindex="0">
        <div id="label" class\$="mdc-select__label [[_float(value)]] [[_hide(label)]]">[[label]]</div>
        <div class="mdc-select__selected-text">[[_display(value)]]</div>
        <div class="mdc-select__bottom-line hidden"></div>
      </div>
      <div id="menu" class\$="mdc-menu mdc-select__menu [[addMenuClass]]">
        <ul class="mdc-list mdc-menu__items" on-click="_selectItem">
          <template is="dom-repeat" id="items" items="[[items]]" mutable-data>
            <li class="mdc-list-item" role="option" tabindex="0">[[_display(item)]]</li>
          </template>
        </ul>
      </div>
      <i id="clear" class$="material-icons mdc-text-field__icon [[_showIfClearable(clearable)]]" on-click="clear">clear</i>
</div>

и мои функции таковы;

static get is() { return 'mdc-select'; }
  static get properties() {
    return {
      addClass: String,
      addMenuClass: String,
      items: {
        type: Array,
        value: () => [],
        observer: "_renderItems"
      },
      value: {
        type: String,
        value: '',
        observer: "_setValue",
        notify: true
      },
      label: String,
      display: {
        type: Function
      },
      error: {
        type: String,
        value: ""
      },
      surfaceWidth: {
        type: Number,
        value: 200
      },
      clearable: {
        type: Boolean,
        value: false
      }
    }
  }

  // display --------------------------------------

  _display(item) {
    return item ? (this.display ? this.display(item) : item) : null
  }

  _hide(val) {
    return val ? null : 'hidden'
  }

  _float(val) {
    return val ? 'mdc-select__label--float-above' : null
  }

  _error(error) {
    return error ? 'error' : null;
  }

  _showIfClearable(clearable) {
    return clearable ? null : 'hidden'
  }

_selectItem(ev) {
    let template = ev.target.__templatizeInstance
    if (template && template.item) {
      this.set('value', template.item)
      this.dispatch('select', template.item)
      // this.component.selectedIndex = template.index;
    } else {
      this.clear()
    }
  }

  _setValue(value) {
    if (!value || !this.component) return
    const val = value
    const idx = this.display ? this.items.findIndex(item => this.display(item) === this.display(val)) : this.items.findIndex(item => item === val)
    this.component.selectedIndex = idx
    this.$.label.classList.add('mdc-select__label--float-above')
  }

  clear() {
    this.dispatch('remove', this.value)
    this.set('value', "")
    if (this.component && typeof this.component.selectedIndex === 'number') { this.component.selectedIndex = -1 }
    this.$.label.classList.remove('mdc-select__label--float-above')
    // this.dispatchSelection()
  }

  dispatch(eventName, value) {
    this.dispatchEvent(new CustomEvent(eventName, {
      detail: { value },
      bubbles: true,
      composed: true
    }));
  }

  dispatchSelection() {
    this.dispatchEvent(new CustomEvent('select', {
      detail: { value: this.value },
      bubbles: true,
      composed: true
    }));
  }

  // init -------------------------------------------

  _renderItems(items) {
    if (items && items.length) { this.attach() }
  }

  attach() {
    // Force a synchronus render so MDC can render items properly
    this.$.items.render();
    this.component = new mdc.select.MDCSelect(this.$.root);

    if (this.value) {
      const val = this.value
      const idx = this.display ? this.items.findIndex(item => this.display(item) === this.display(val)) : this.items.findIndex(item => item === val)
      this.component.selectedIndex = idx
    }
  }
...