【问题标题】:Angular directives - how to listen to outputs from child componentsAngular 指令 - 如何监听子组件的输出
【发布时间】:2020-02-11 18:58:12
【问题描述】:

我的 customDirective 如何在以下示例中监听 clrDateChange 输出?

<clr-date-container customDirective>
    <label for="dateControl">Requirement Date</label>
    <input id="dateControl" type="date" [placeholder]="'TT.MM.YYYY'" [(clrDate)]="item.requirementDate" (clrDateChange)="onChange($event)" [ngModel]="null" name="requirementDate"/>
    <clr-control-error>{{ 'FORMS.VALIDATION.DATE_INVALID' | translate }}</clr-control-error>
</clr-date-container>

对于普通的 DOM 事件,我可以使用 elementRef.nativeElement.querySelector('input') 检索子输入元素。然而 clrDateChange 是一个角度输出。

我想知道指令是否通常可以监听子组件的输出。

【问题讨论】:

    标签: angular angular-directive angular-event-emitter


    【解决方案1】:

    您可以使用模板引用变量。

    @Directive({
      selector: '[customDirective]',
      exportAs: 'CustomDirective'
    })
    export class CustomDirective {
    
      foo() {
        // do something
      }
    
    }
    
    <clr-date-container customDirective #myCustomDirective="CustomDirective">
      <label for="dateControl">Requirement Date</label>
      <input id="dateControl"
             type="date"
             [placeholder]="'TT.MM.YYYY'"
             [(clrDate)]="item.requirementDate"
             (clrDateChange)="onChange($event); myCustomDirective.foo()"
             [ngModel]="null"
             name="requirementDate"/>
      <clr-control-error>
        {{ 'FORMS.VALIDATION.DATE_INVALID' | translate }}
      </clr-control-error>
    </clr-date-container>
    

    编辑

    如果只是订阅clrDate.clrDateChange

    import { Directive, ContentChild, AfterContentInit, OnDestroy } from '@angular/core';
    import { Subject } from 'rxjs';
    import { takeUntil } from 'rxjs/operators';
    
    import { ClrDateComponent } from '@clr/angular/*';
    
    @Directive({
      selector: '[customDirective]',
      exportAs: 'CustomDirective'
    })
    export class CustomDirective implements AfterContentInit, OnDestroy {
    
      private destroy$ = new Subject();
    
      @ContentChild(ClrDateInput, {static: false}) clrDateComponent: ClrDateInput;
    
      ngAfterContentInit() {
        if (this.clrDateComponent) {
          this.clrDateComponent.clrDateChange
          .pipe(takeUntil(this.destroy$))
          .subscribe(data => {
            this.foo(data)
          })
        }
      }
    
      ngOnDestroy() {
        this.destroy$.next();
        this.destroy$.complete();
      }
    
      foo(data) {
        console.log(data);
        // do something
      }
    
    }
    

    【讨论】:

    • 这个方法很有创意,谢谢!但是如果 clrDate 不导出自己,我还能从我的指令中访问它吗?
    • clrDate 或任何组件?
    • 好吧 clrDate 是第三方指令,所以是的,如果可能的话,我想从外部指令访问任何其他组件或指令:)
    • 但输出名称不确定?喜欢xxxChange
    • 好吧,归根结底是如何获得对第 3 方指令或组件的引用,不是吗?应该记录 XXXChange,以便我了解它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-09
    • 2015-05-07
    • 2018-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多