zipCodes
- это труба string[]
, а async
принимает только значение Observable
или Promise
в качестве входа. Отсюда и ошибка.
Избавьтесь от трубы async
из шаблона.
Примерно так:
<form>
<mat-form-field>
<input type="text" placeholder="ZipCode" aria-label="ZipCode"
matInput [formControl]="zipCodeControl" [matAutocomplete]="auto">
<mat-autocomplete #auto="matAutocomplete">
<mat-option *ngFor="let zipCode of zipCodes"
[value]="zipCode">
{{zipCode}}
</mat-option>
</mat-autocomplete>
</mat-form-field>
</form>
У меня обычно есть одна стандартная программа, выделенная обеспечению электричеством обработчиков событий. Там, я использую анонимных делегатов или лямбды для фактических обработчиков, сохраняя их максимально короткими. Эти обработчики имеют две задачи:
Сделанный, я постарался не загромождать свое пространство имен класса с методами обработчика событий, которые не могут чисто использоваться для других целей и вынудили меня думать о потребностях и целях методов действия, которые я действительно реализую, обычно приводя к более чистому коду.
На основе небольшого эксперимента с компилятором я сказал бы, что компилятор достаточно умен для создания закрытия. То, что я сделал, было простым конструктором, который имел две различных лямбды, которые использовались для Предиката в Списке. Найдите ().
Первый lamdba использовал твердое кодированное значение, второе использовало параметр в конструкторе. Первая лямбда была реализована как частный статический метод для класса. Вторая лямбда была реализована как класс, который выполнил закрытие.
Таким образом, Ваше предположение, что компилятор достаточно умен, корректно.
Большинство тех же характеристик лямбд может применяться одинаково хорошо в других местах, где можно использовать их. Если обработчики событий не являются местом для них, я не могу думать немного лучше. Это - автономное устройство единственной точки логики, расположенной в ее единственной точке.
Во многих случаях событие разработано для получения небольшого пакета контекста, который оказывается просто правильным для задания под рукой.
Я полагаю, что это один из "хороших запахов" в смысле рефакторинга.
Каждая функция лямбды формирует закрытие по своему содержанию объема. Это могло означать, что временные объекты, созданные ранее в конструкторе, остаются в живых для намного дольше, чем им нужно к должному к закрытиям, поддерживающим ссылки на них. Теперь, надо надеяться, компилятор достаточно умен для исключения объектов из закрытия, которое не использует лямбда, но я не уверен. Кто-либо знает?
Из того, что я читал, компилятор C# или генерирует анонимный метод или анонимный внутренний класс, в зависимости от того, если он должен закрыться по содержанию объема или нет.
Другими словами, если Вы не получите доступ к содержанию объема из Вашей лямбды, то это не генерирует закрытие.
Однако это - немного "слуха", и я хотел бы иметь кого-то, кто более хорошо осведомлен с компилятором C#, высказывают мнение об этом.
Однако старый C# 2.0, анонимный синтаксис делегата сделал то же самое, и у меня есть почти всегда использование анонимные делегаты к коротким обработчикам событий.
Вы покрыли различные за и против вполне хорошо, если необходимо отсоединить обработчик событий, не используйте анонимный метод, иначе я - все для него.