Избегайте вызова функции в привязке

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

Это только упрощенный пример, но он должен показать проблему:

some-template.html

<ng-container *ngFor = "let control of group.Controls">
    <div [ngSwitch] = "control.ControlTypeName" >
        <input *ngSwitchCase = "'int'" type = "text" [formControlName] = "getFormControlName(control.PropertyName)">
        ...
    </div>
</ng-container>

some-component.ts

public getFormControlName(propertyName: string) {
    return this.someArray.find(x => x.key === propertyName).formControlName;
}

Проблема в том, что свойство, которое мне нужно для входа [formControlName], отсутствует в объекте «управления», который я перебирал с помощью *ngFor. Свойство находится в другом массиве, и я могу найти его, только вызвав функцию.

Есть ли способ этого избежать?

Вы можете сохранить все вычисленные имена formControl в отдельном объекте, например, formControls, идентифицированном ключом control.ControlTypeName. Вероятно, вам следует сделать это внутри метода установки group.Controls. Вы можете перенести функциональность getFormControlName() в его установщик. Таким образом, всякий раз, когда значение group.controls изменяется, он пересчитывает formControlNames, а затем в вашем шаблоне вы можете получить к нему доступ, как к formControls[control.ControlTypeName].

Amit Chigadani 26.09.2018 14:36
Тестирование функциональных 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
3
1
123
1

Ответы 1

Чтобы этого избежать, у вас должна быть справочная таблица (хеш-таблица / карта / объект), проиндексированная элементом массива key со значением formControlName в качестве значения:

some-component.ts

some_array = [{key: 'a', formControlName: 'b'}, ...];
control_name = this.some_array.reduce(
                   (obj, el) => ((obj[el.key] = el.formControlName), obj), {});

some-template.html

<input *ngSwitchCase = "'int'" [formControlName] = "control_name[control.PropertyName]" type = "text">

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