代码之家  ›  专栏  ›  技术社区  ›  Gargoyle

角度使用$event.target或ViewChild…有区别吗?

  •  0
  • Gargoyle  · 技术社区  · 6 年前

    <button (click)="complete($event.target)">
    

    然后在我的typescript文件中,我将其关闭,直到操作完成,如下所示:

    complete(button: HTMLButtonElement): void {
        button.disabled = true;
    
        this.service.doSomething.subscribe(..., ..., () => button.disabled = false);
    }
    

    ViewChild

    1 回复  |  直到 6 年前
        1
  •  1
  •   joh04667    6 年前

    @ViewChild 主要用于您需要 组件及其属性的抽象,通常作为父组件从子组件抽象出一些逻辑。您可以将整个子类作为父类中的属性,并可以对其执行任何操作。它也被用作一种抓取数据的方法 DebugElement 离开大教堂。

    模板绑定 Inputs Outputs 在这些交互可以提供完整功能的情况下,对使用它的组件可用。Angular在其自己的区域中处理这些输入和输出,并更改检测周期。

    话虽如此,使用 @viewChild

    话虽如此,你说的是开玩笑 一个HTML元素的。你这么做有很多原因 shouldn't interact with the DOM directly 有棱角的。该框架从代码中完全抽象出DOM,并且 reasons behind that.

    我认为最好的做法是让组件代表按钮的状态,并允许Angular为您更改视图:

    <button (click)="complete($event.value)" [disabled]="formDisabled">
    

    组件1.ts:

    public formDisabled = false;
    
    complete(value: string): void {
        this.formDisabled = true;
    
        this.service.doSomething.subscribe(..., ..., () => this.disabled = false);
    }
    

    这样,当组件本身表示状态时,可以在框架内进行角度句柄更改检测和视图渲染。

    NgForms ,因为您可以将禁用的属性绑定到窗体本身的状态。甚至还有一些挂起的提交状态和 asynchronous validators! .