От новичка до гуру: Курсы программирования на CyberDuff

Как передать асинхронную переменную в функцию шаблона (действия)?

Мне нужно передать асинхронную переменную в функцию. Что-то вроде этого:

<div class="team" (click)="addToFavorite((match | async)?.id)">

И конечно у меня ошибка.

Ошибка синтаксического анализатора: нельзя использовать канал в выражении действия.

Может быть, есть способ преобразовать асинхронную переменную в JavaScript?


  • Было бы любезно, если бы вы сообщили нам, что это за ошибка. 28.10.2016
  • Стоит попробовать (click)="match.then(val => addToFavorite(val?.id))" 28.10.2016
  • @GünterZöchbauer ``` Ошибка синтаксического анализатора: не может иметь канал в выражении действия. ``` 28.10.2016
  • @GünterZöchbauer Спасибо за быстрый ответ! Это не сработало. polyfills.js:3 Unhandled Promise rejection: Template parse errors: Parser Error: Unexpected token > 28.10.2016
  • Затем вам, вероятно, нужно определить вспомогательный метод 28.10.2016

Ответы:


1

Другой вариант для простых переменных и без каких-либо наблюдаемых — запись значения переменной в скрытый ввод:

<div *ngIf="(match | async)?.id">
    <input  #myControl [value]="(match | async).id" type="hidden" />
    <div class="team" (click)="addToFavorite(myControl.value)">
</div>
05.08.2017
  • Очень хороший обходной путь! Однако я мог заставить это работать только без оболочки * ngIf вокруг ввода и кнопки. 22.10.2017
  • Потрясающий! Может быть решением 24.04.2018
  • Этот подход не работает с логическими значениями, потому что *ngIf не будет работать с ложным 11.11.2019

  • 2

    Вот как я это решил:

    <div *ngIf="(match | async) as match" class="team" (click)="addToFavorite(match.id)">
    

    Это коротко, просто и работает.

    <ng-container *ngIf="(match | async) as match">
       <div class="team" (click)="addToFavorite(match.id)">
       </div>
    </ng-container>
    

    Обновление от 20 января 2021 г.

    Чтобы быть более ясным, я бы назвал наблюдаемый источник сопоставления как match$.

    И теперь мы можем использовать новый пакет @ngrx/component и использовать новую структурную директиву ngrxLet:

    <ng-container *ngrxLet="match$ as match">
      <div class="team" (click)="addToFavorite(match.id)">
      </div>
    </ng-container>
    

    Асинхронный канал больше не нужен. Дополнительная информация о ngrx.io доступна по этой ссылке.

    13.11.2018
  • Мне нравится этот ответ, так как он основан на шаблонах. 15.03.2019
  • Спасибо миллион раз 21.11.2019

  • 3

    Вы не можете сделать это в шаблоне.

    Но ты можешь:

    <div class="team" (click)="addToFavorite()">
    

    и в вашем .component.ts:

    public addToFavorite() {
      this
        .match  // should retain last value (e.g. use BehaviorSubject)
        .first() // completes after passing one value only
        .subscribe(
          (matchValue) => {
            // your logic here
        });
    }
    

    Примечание: Подписываемся (и сразу отписываемся), аналогично async пайп подписывается на Observable.

    11.08.2017
  • Спасибо за Ваш ответ! 25.04.2018

  • 4

    Как насчет:

    <div class="team" (click)="addToFavorite(match)">
    

    а затем в вашем коде:

    addToFavorite(obs: Observable<any>) {
      obs.take(1).subscribe(value => {
        addToFavoriteById(value.id);
      });
    }
    
    28.10.2016
  • У меня ошибка консоли `встроенный шаблон:12:38, вызванная: obs.take не является функцией` 28.10.2016
  • Вам нужно импортировать такие операторы, как .take() 28.10.2016

  • 5

    Кажется, вам нужно использовать вспомогательный метод:

    <div class="team" (click)="onClick(match)">
    
    class MyComponent {
      onClick(event) {
        event.then(val => this.addToFavorite(val?.id);
      }
      addToFavorite(val) {
      }
    }
    
    28.10.2016
  • Я не могу использовать этот val?.id, поэтому я просто передаю значение, и я все равно получаю наблюдаемое в addToFavorite(), а не само значение 28.10.2016
  • Почему нельзя использовать val?.id? 28.10.2016
  • Насколько я могу судить, оператор ? доступен только внутри шаблонов angular 2, а не внутри кода компонента Typescript. Эта функция еще не реализована для Typescript, но, похоже, она находится в разработке: github. com/Microsoft/TypeScript/issues/16 20.04.2017
  • @DevonSams спасибо. Я так привык от Дарта, что пропустил, что его еще нет в ТС. Вы правы, в настоящее время он доступен только в привязках шаблонов. 20.04.2017
  • Новые материалы

    Представляем Narwhal Technologies (Nrwl)
    6 декабря 2016 г. Маунтин-Вью, Калифорния С тех пор, как Виктор Савкин и я (Джефф Кросс) присоединились к команде Angular в Google на заре Angular 1, Angular продемонстрировал феноменальный..

    Путь AWS  — «Изучение машинного обучения — 10 начинающих ИИ и машинного обучения на AWS».
    Универсальный ресурсный центр для изучения искусственного интеллекта и машинного обучения. НОЛЬ или ГЕРОЙ, начните свое путешествие здесь. Получите решения и пройдите обучение у экспертов AWS...

    5 простых концепций Python, ставших сложными
    #заранее извините 1) Переменные x = 4 y = 5 Переменная в Python — это символическое представление объекта. После присвоения некоторого объекта переменной Python мы приобретаем..

    «Освоение вероятности: изучение совместной, предельной, условной вероятности и теоремы Байеса —…
    Виды вероятности: Совместная вероятность Предельная вероятность Условная вероятность Диаграмма Венна в вероятностях: В “Set Theory” мы создаем диаграмму Венна...

    Основы Spring: Bean-компоненты, контейнер и внедрение зависимостей
    Как лего может помочь нашему пониманию Когда мы начинаем использовать Spring, нам бросают много терминов, и может быть трудно понять, что они все означают. Итак, мы разберем основы и будем..

    Отслеживание состояния с течением времени с дифференцированием снимков
    Время от времени что-то происходит и революционизирует часть моего рабочего процесса разработки. Что-то более забавное вместо типичного утомительного и утомительного процесса разработки. В..

    Я предполагаю, что вы имеете в виду методы обработки категориальных данных.
    Я предполагаю, что вы имеете в виду методы обработки категориальных данных. Пожалуйста, проверьте мой пост Инструментарий специалиста по данным для кодирования категориальных переменных в..