代码之家  ›  专栏  ›  技术社区  ›  Wilhelmina Lohan

为什么aot编译器不会在缺少属性时出错?

  •  2
  • Wilhelmina Lohan  · 技术社区  · 6 年前

    使用以下代码:

    <button (click)="myMethod()">myMethod()</button>
    <!-- <button (click)="foo()">foo()</button> -->
    
    <ng-container [ngSwitch]="state">
      <ng-container *ngSwitchCase="0">
        <div></div>
        <button (click)="myMethod()">myMethod()</button>
        <button (click)="foo()">foo()</button><!-- why no error -->
      </ng-container>
      <div *ngSwitchCase="1"></div>
    </ng-container>
    

    组成部分

    export class MyComponent {
    
      public state = 0;
    
      public myMethod(): void {
        // no op
      }
    
    }
    

    ng build --aot

    类型“MyComponent”上不存在属性“foo”。

    <button (click)="foo()">foo()</button> 内部 ng-container 不是错误吗?

    在你建议之前:

    <div *ngSwitchCase="0">
      <div></div>
      <button (click)="myMethod()">myMethod()</button>
      <button (click)="foo()">foo()</button><!-- why no error -->
    </div>
    

    那将变成

    <div>
      <div></div>
      <button>myMethod()</button>
      <button>foo()</button>
    </div>
    

    但我只需要

    <div></div>
    <button>myMethod()</button>
    <button>foo()</button>
    

    围绕这一点还有其他的方法,但问题是在做出错误或壮举之前要有基本的理解。

    2 回复  |  直到 6 年前
        1
  •  2
  •   Keenan Diggs    6 年前

    “还有其他办法吗…”

    你试过这个吗: https://angular.io/guide/aot-compiler#fulltemplatetypecheck ?

    奖金:

    另请参见编译器github上关于绑定表达式的本节: https://github.com/angular/angular/blob/master/aio/content/guide/aot-compiler.md#phase-3-binding-expression-validation

    验证使用TypeScript类型检查器和提供给TypeScript编译器的选项来控制类型验证的详细程度

        2
  •  1
  •   Alex Beugnet    6 年前

    这是我的评论:

    AoT预先编译模板,并寻找要生成的绑定。另一方面,将它放在ng容器中是一件特殊的事情,因为ng容器在被调用之前不会被解释和编译。

    见本文:

    https://blog.angular-university.io/angular-ng-template-ng-container-ngtemplateoutlet/


    我试着搜索更多的信息,我只是回到你关于角度问题的第一个评论:

    https://github.com/angular/angular/issues/20287 与此相关的问题: https://github.com/angular/angular/issues/19792 .

    我想你现在对此无能为力!