Как объявить новые имена переменных в шаблонах Angular 17?
Во всех версиях Angular <17 можно было объявлять новые имена переменных или, что лучше: создавать псевдонимы переменных в шаблонах, как в этом упрощенном примере:
<ng-container *ngIf="objectlist$ | async as list">
{{ list.name }}
</ng-container>
Теперь Angular 17 представил новый@if
синтаксис (что мне очень нравится). Поэтому я бы конвертировал фрагмент следующим образом:
@if (objectlist$ | async as list) {
{{ list.name }}
}
Однако это не работает, потому чтоas list
не работает с новой синтаксической схемой. Но как мне добиться того же, что и исходный сценарий, с новым синтаксисом?
1 ответ
Псевдоним по-прежнему поддерживается в синтаксисе потока управления , если вы добавляете точку с запятой (;) после
@if (objectlist$ | async; as list) {
{{ list.name }}
}
Однако псевдоним не поддерживается с
Соответствующие части:
Мы обсуждали это некоторое время назад, но решили не поддерживать, поскольку псевдоним существует только для обратной совместимости с ngIf.
и
Мы подробно обсуждали этот конкретный момент во время разработки потока управления и решили не расширять поддержку as. В частности, @if в компонентах сигнала вообще не будет поддерживать его, поскольку он несовместим с потоком данных сигнала.
as фактически является объявлением локальной переменной, аналогично let Internal = Outer.expression;. Если вы представляете, что внешнее выражение считывает сигналы, то внутреннее выражение кэширует полученное значение, чтобы использовать его в дочернем шаблоне. Это «теряет реактивность» — дочерний шаблон никогда не будет обновляться, потому что он не выполняет считывание сигнала самостоятельно. Вместо этого вычисленные сигналы решают эту проблему гораздо более каноническим способом.