Как привязать результат @for к переменной?

В Angular 16 (и более ранних версиях) можно было использовать «as» после цикла for, чтобы объявить отфильтрованные результаты как переменную.

Вот так:

<div *ngFor = "let item of (items | pipe: Query) as results">
{{item}}
</div>

Как мне добиться этого в angular 17?

Я уже пробовал использовать

@for (let item of (items | pipe: Query) as results; track item.id) {
<div>
{{item}}
</div>
}

но это не работает. Я хотел бы иметь возможность использовать отфильтрованные результаты и сохранять их внутри массива элементов.

Это возможно? Любая помощь будет принята с благодарностью!

Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
2
0
135
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Подумайте, что с помощью синтаксиса @for вы не можете объявить локальную переменную с помощью as.

Вы можете поискать работу с NgTemplateOutlet.

<ng-container
  [ngTemplateOutlet] = "resultTemplate"
  [ngTemplateOutletContext] = "{$implicit: items | pipe: Query}"
>
</ng-container>

<ng-template #resultTemplate let-results>
  {{ results | json }} 
  @for (item of results; track item.id) {
    <div>{{item | json}}</div>
  }
</ng-template>

Альтернативно вы можете использовать Pipe в компоненте.

@Component({
  selector: 'app-root',
  standalone: true,
  templateUrl: `main.html`,
  providers: [YourQueryPipe]
})
export class App {
  name = 'Angular';

  items = [{ id: '1' }, { id: '2' }, { id: '3' }];

  constructor(private queryPipe: YourQueryPipe) {}

  queryItems = this.queryPipe.transform(this.items, /* value/fiter needed in YourQueryPipe */)
}
@for (item of queryItems; track item.id) {
  <div>{{item}}</div>
}

Демо @ StackBlitz

Ответ принят как подходящий

Псевдонимы коллекций (т. е. с ключевым словом as) не поддерживаются с помощью @for в синтаксисе потока управления Angular 17.

См. этот выпуск на GitHub с соответствующей цитатой здесь:

@for, как уже упоминалось, не поддерживает псевдонимы коллекции.

В настоящее время угловая миграция не регистрирует предупреждение, но должна регистрировать предупреждение при обнаружении as во время миграции. Есть открытая проблема, как это исправить.

В качестве альтернативы, если вам нужен явный псевдоним, можно извлечь результаты с помощью канала в @if, а затем использовать их в @for. Что-то вроде этого:

@if (items$ | async; as results) {

@for (item of results; track item.id) {
<div>
{{item}}
</div>
}

Прежде всего, я должен сказать, что вам не следует использовать let item в этом синтаксисе. вам стоит написать @for(item of items){}. а что касается псевдонима, вы можете использовать псевдоним в @if, но, насколько я знаю, в @for псевдонима нет. вы можете использовать @if (items; as x) перед циклом:

@if (items | pipe: Query; as results){
  @for (item of results; track item.id) {
    <div>
      {{item}}
    </div>
  }
}

Другие вопросы по теме