Как показать опции в разделе выбора (Угловой материал 7)? - PullRequest
0 голосов
/ 19 ноября 2018

Как показать опции в разделе выбора (Угловой материал 7)? enter image description here

Что-то вроде выбора по умолчанию:

enter image description here

Ответы [ 2 ]

0 голосов
/ 19 ноября 2018

«Правильный» ответ - использовать disableOptionCentering на вашем коврике, но даже это только мешает заполнению заполнителя и не имитирует базовый собственный выбор.

<mat-select placeholder="Favorite food" disableOptionCentering>

Настоятельно не одобряется манипулирование DOM нативного элемента в Angular, но, к сожалению, это единственный способ, который я нашел, чтобы делать подобные вещи ...

  • Надеюсь, кто-нибудь опубликует настоящий «угловой» способ сделать этот вид вещи, как я ловлю себя на манипулировании библиотекой материалов для этих типы причин.

Вам нужно будет обернуть ваши параметры оболочкой div и назначить templateRef #matOptionDiv, чтобы вы могли использовать это в своем компоненте, чтобы получить родительский элемент (элементы) раскрывающегося списка вашего параметра, который является наложением CDK.

<div #matOptionDiv>
   <mat-option *ngFor="let food of foods" [value]="food.value">
      {{food.viewValue}}
   </mat-option>
</div> 

Затем используйте событие click для mat-form-field, чтобы вызвать метод в вашем компоненте для выравнивания наложения

<mat-form-field (click)="positionDropDown()">

Затем в вашем компоненте используйте @ViewChild, чтобы получить templateRef

import {Component, ViewChild} from '@angular/core';

@ViewChild('matOptionDiv') _matOptionDiv:any;

Затем создайте свой метод для расчета нового значения top на оверлее и назначьте его ... setTimout необходим для запуска изменения с циклом дайджеста.

positionDropDown(){
  let offsetY = 
  this._matOptionDiv.nativeElement.parentElement.parentElement.style.top

  setTimeout(()=>{this._matOptionDiv.nativeElement.parentElement.parentElement.style.top = parseInt(offsetY.slice(0, -2))+40+'px'},0)
  }

Это очень "хакерское" решение, и оно не очень красивое, надеюсь, кто-то когда-нибудь опубликует ответ с истинным "угловым" решением этого вопроса.

  • К сожалению, в источнике mat-select происходят вычисления для программного определения вершины оверлея на основе видимой области через _calculateOverlayOffsetY ... ничего из этого не отображается в API, поэтому я Я не могу манипулировать этим "правильно", и я боюсь, что манипуляции с DOM могут будь единственным.

https://github.com/angular/material2/blob/6d7f41739207e469e626963d64e661401629902d/src/lib/select/select.ts#L1154

Вот Stackblitz для вашего обзора.

https://stackblitz.com/edit/angular-nafuur?embed=1&file=app/select-overview-example.ts

Редакция

Я провел еще несколько исследований по этому вопросу, и манипулирование DOM допустимо в угловом режиме, если вы используете Renderer2, поскольку он взаимодействует с адаптером DOM и обновляет DOM "соответствующим образом" ... делая DOM независимой от платформы.

Пожалуйста, обратитесь к этому видео YouTube для получения дополнительной информации.

Не могу потрогать это! Что не делать с DOM от Max NgWizard


Обновление кода Stackblitz ниже

import {Component, ViewChild, ElementRef, Renderer2} from '@angular/core';

@ViewChild('matOptionDiv') _matOptionDiv:ElementRef;

constructor(private renderer: Renderer2) { }

 positionDropDown() {
    let offsetY = this._matOptionDiv.nativeElement.parentElement.parentElement.style.top;

    setTimeout(() => {
      // this._matOptionDiv.nativeElement.parentElement.parentElement.style.top = parseInt(offsetY.slice(0, -2))+40+'px'},0)
      this.renderer.setStyle(this.renderer.parentNode(this.renderer.parentNode(this._matOptionDiv.nativeElement)), 'top', parseInt(offsetY.slice(0, -2)) + 40 + 'px');
    });
  }
0 голосов
/ 19 ноября 2018

Документы, из которых вы получили скриншоты, дают довольно полный обзор того, как включить этот компонент, просто убедитесь, что вы нажимаете

<>

в правом верхнем углу примера для кода, который создалЭто.Если это что-то конкретное, вы боретесь с сообщением об ошибках, которые вы получаете

https://material.angular.io/components/select/overview

...