как создать настраиваемую директиву для выбора мата и прослушивания события изменения

В моем проекте необходимо использовать ElementRef nativeelement.valueиз-за некоторых ошибок только для чтения. только моя директива

      export class DeliveryAcrossDirective {
  @Input('key') key: string;
  @Input('component') component: string;
  constructor(
    private store: Store,
    private elementRef: ElementRef<HTMLInputElement>
  ) {
    this.key = '';
    this.component = '';
  }
  @HostListener('change') onChange() {
    console.log('noticed something');

    this.store.dispatch<IAction<IAdjust>>({
        type: RDX_DELIVERY_ACROSS_ADJUST,
        payload: {
          key: this.key,
          value: this.elementRef.nativeElement.value
        },
        component: this.component
      })
  }

}

не фиксирует событие изменения из моего выбора коврика

      <mat-form-field class="full-width" [@transformRightLeftStateTrigger]="stateDown | async">
  <mat-label>
    {{ country | async }}
  </mat-label>
  <mat-select [formControl]="countryFormControl"
  appDeliveryAcross
  [key]="'iso'"
  [component]="'delivery-across'" >
    <mat-option *ngFor="let language of (languages | async)"  [value]="language.value">
      {{ language.country }}
    </mat-option>
  </mat-select>
</mat-form-field>

в то время как классические входы делают

              <mat-form-field class="full-width" [@transformRightLeftStateTrigger]="stateDown | async">
          <input matInput
          [formControl]="minFormControl"
          [errorStateMatcher]="errorStateMatcher"
          placeholder="Minimaal"
          appDeliveryAcross
          [key]="'min'"
          [component]="'delivery-across'"
          type="number">
        </mat-form-field>

Кто-нибудь знает способ, как зафиксировать событие изменения из выбора мата с помощью директивы?

3 ответа

Решение

Я не уверен, какую версию Angular Material вы используете, но, вероятно, changeпростое событие не существует для /questions/32208976/uglovoj-6-material-kovrik-vyibran-metod-izmeneniya-udalen/32208978#32208978

Похоже, вы изменили свою директиву для mat-selects

Вы должны слушатьselectionChangeсобытие

      @Directive({
    selector: '[appMyDirective]',
})
export class MyDirective {
    constructor() {}

    @HostListener('selectionChange', ['$event'])
    onSelectionChange(event: MatSelectChange): void {
        console.log(event);
    }
}

Для обнаружения изменений mat-select тебе не нужно HostListenerпросто подпишитесь selectionChange из MatSelect

      export class DeliveryAcrossDirective implements OnInit, OnDestroy {
  selectionSub: Subscription;

  constructor(
    private host: MatSelect
  ) {
  }

  ngOnInit(): void {
    this.selectionSub = this.host.selectionChange.subscribe(option => {
      console.log(option);
      // Do something
    });
  }

  ngOnDestroy(): void {
    this.selectionSub?.unsubscribe();
  }
}
Другие вопросы по тегам