Почему не будет ошибки компилятора при отсутствии свойства? - PullRequest
0 голосов
/ 04 января 2019

Со следующим кодом:

шаблон

<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 строит, но если вы раскомментируете вторую строку в шаблоне, вы ожидаете получить

Свойство 'foo' не существует для типа 'MyComponent'.

Почему <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 ]

0 голосов
/ 04 января 2019

Это был мой комментарий:

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

См. Эту статью:

https://blog.angular -university.io / угловая нг-шаблон нг-контейнер-ngtemplateoutlet /


Я попытался найти в ней больше информации, и я просто вернулся к вашему первому комментарию об угловой проблеме:

Из этой темы https://github.com/angular/angular/issues/20287 к этой проблеме привязано: https://github.com/angular/angular/issues/19792.

Кажется, это постоянная ошибка, так что это означает, что ng-контейнеры должны быть скомпилированы. Полагаю, сейчас вы ничего не можете с этим поделать!

0 голосов
/ 04 января 2019

«Есть ли другие способы обойти это ...?»

Вы пробовали это: https://angular.io/guide/aot-compiler#fulltemplatetypecheck?

Похоже, что эта настройка AOT (в настоящее время) неактивна по умолчанию.

Бонус:

Также смотрите этот раздел в github компилятора по выражениям привязки: https://github.com/angular/angular/blob/master/aio/content/guide/aot-compiler.md#phase-3-binding-expression-validation

При проверке используется средство проверки типа TypeScript и параметры, предоставленные компилятору TypeScript, чтобы контролировать, насколько детализирована проверка типа

На этом этапе выдается ошибка «Свойство X не существует для типа Y», и уровень детализации проверки настраивается с помощью параметров компилятора, таких как вышеупомянутый параметр «fulltemplatetypecheck».

...