#angular #angular-material
Вопрос:
Я разрабатываю интерфейс с использованием angular 11, и есть несколько мест, где мне нужно применить *ngIf с одним и тем же условием,
<mat-option *ngIf="horizontalStepperForm.value.step2.companyType == 'Head_Office'" value="Light">Light</mat-option>
<mat-option *ngIf="horizontalStepperForm.value.step2.companyType == 'Head_Office'" value="Basic">Basic</mat-option>
<mat-option *ngIf="horizontalStepperForm.value.step2.companyType == 'Head_Office'" value="Professional">Professional</mat-option>
Эти значения берутся из группы форм, и есть ли какой-либо способ устранить это же условие, используя метод, позволяющий уменьшить жесткое кодирование одного и того же везде в HTML?
Комментарии:
1. не рекомендуется помещать вызов метода
*ngIf=checkVisibility()
в html. Причина в том, что метод будет вызываться каждые 1-2 секунды (потому что он запускается при каждом обнаружении изменений) . Попробуйте применитьconsole.log
любой такой метод и убедитесь в этом сами. Я могу дать несколько советов. Создайте постоянную переменную со строкойHead_office
или вы также можете задать логическое значение, подписавшись наhorizontalStepperForm.valueChanges.subscribe( data => {})
. Дайте мне знать, если вам понадобится больше разъяснений по этому поводу2. @ShashankVivek Эта логика часто вызывается во время цикла угловой перерисовки, независимо от того, вставляете вы ее в метод или нет. Я не понимаю, как использование константы решило бы это, и что бы вы сделали,
valueChanges
чтобы решить эту проблему.
Ответ №1:
Оберните его в функцию в классе компонентов:
isCompanyTypeHeadOffice() {
return horizontalStepperForm.value.step2.companyType == 'Head_Office'
}
Тогда вы можете сделать это:
<mat-option *ngIf="isCompanyTypeHeadOffice()" value="Light">Light</mat-option>
<mat-option *ngIf="isCompanyTypeHeadOffice()" value="Basic">Basic</mat-option>
<mat-option *ngIf="isCompanyTypeHeadOffice()" value="Professional">Professional</mat-option>
Мы часто делаем это; не только для повторяющихся условий, но я считаю, что сохранение логики в шаблоне является анти-шаблоном. Лучше поместить эту логику в класс компонентов, где ее можно будет легче протестировать с помощью модуля.
Ответ №2:
Я все еще рекомендую это
get bool():boolean{
return this.horizontalStepperForm.value.step2.companyType == 'Head_Office'
}
<mat-option *ngIf="bool" value="Light">Light</mat-option>