Лямбды для обработчиков событий?

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>
9
задан P Daddy 23 December 2008 в 18:01
поделиться

4 ответа

У меня обычно есть одна стандартная программа, выделенная обеспечению электричеством обработчиков событий. Там, я использую анонимных делегатов или лямбды для фактических обработчиков, сохраняя их максимально короткими. Эти обработчики имеют две задачи:

  1. Распакуйте параметры события.
  2. Назовите именованный метод с соответствующими параметрами.

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

4
ответ дан 4 December 2019 в 21:52
поделиться

На основе небольшого эксперимента с компилятором я сказал бы, что компилятор достаточно умен для создания закрытия. То, что я сделал, было простым конструктором, который имел две различных лямбды, которые использовались для Предиката в Списке. Найдите ().

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

Таким образом, Ваше предположение, что компилятор достаточно умен, корректно.

2
ответ дан 4 December 2019 в 21:52
поделиться

Большинство тех же характеристик лямбд может применяться одинаково хорошо в других местах, где можно использовать их. Если обработчики событий не являются местом для них, я не могу думать немного лучше. Это - автономное устройство единственной точки логики, расположенной в ее единственной точке.

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

Я полагаю, что это один из "хороших запахов" в смысле рефакторинга.

1
ответ дан 4 December 2019 в 21:52
поделиться

Каждая функция лямбды формирует закрытие по своему содержанию объема. Это могло означать, что временные объекты, созданные ранее в конструкторе, остаются в живых для намного дольше, чем им нужно к должному к закрытиям, поддерживающим ссылки на них. Теперь, надо надеяться, компилятор достаточно умен для исключения объектов из закрытия, которое не использует лямбда, но я не уверен. Кто-либо знает?

Из того, что я читал, компилятор C# или генерирует анонимный метод или анонимный внутренний класс, в зависимости от того, если он должен закрыться по содержанию объема или нет.

Другими словами, если Вы не получите доступ к содержанию объема из Вашей лямбды, то это не генерирует закрытие.

Однако это - немного "слуха", и я хотел бы иметь кого-то, кто более хорошо осведомлен с компилятором C#, высказывают мнение об этом.

Однако старый C# 2.0, анонимный синтаксис делегата сделал то же самое, и у меня есть почти всегда использование анонимные делегаты к коротким обработчикам событий.

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

2
ответ дан 4 December 2019 в 21:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: