Как применить стиль ngStyle к состоянию фокусировки в Angular 9

#css #angular

#css #angular

Вопрос:

У меня есть стиль, который я хочу применить к элементу только тогда, когда его состояние «фокус». Большинство цветов для этого сайта взяты из API, поэтому я добавляю их там, где это необходимо, с помощью ngStyle, который отлично работал до тех пор, пока мне не понадобился только один, применяемый при фокусировке в текстовом поле.

 <div class="form__group__full">
    <input type="text" class="form__field" id="callbackName" [(ngModel)]="name" placeholder="e.g. John" 
    [ngStyle]="{'color': brand?.colours.primary, 
                  'border-bottom': '2px solid '   brand?.colours.secondary, 
                  'border-image:focus': 'linear-gradient(to right, '   brand?.colours.primary   ', '   brand?.colours.secondary   ')'}">
    <label for="callbackName" class="form__label">Name</label>
</div>
  

Свойства border-bottom и color работают нормально, но свойство border-image было просто ударом в темноте, если честно — как я могу применить стиль динамически, только когда объект находится в состоянии фокусировки и без вызова предопределенного класса в таблице стилей?

Ответ №1:

Вы могли бы ввести логический флаг (например. focus ) в контроллере и использовать его для установки стилей. Настройте focus флаг на основе focus и blur событий.

Попробуйте следующее

Контроллер

 export class SampleComponent {
  focus = false;    // <-- default value
  ...
}
  

Шаблон

 <div class="form__group__full">
  <input (focus)="focus=true" (blur)="focus=false" type="text" class="form__field" id="callbackName" [(ngModel)]="name" placeholder="e.g. John" 
    [ngStyle]="focus ? {'color': brand?.colours.primary, 
                'border-bottom': '2px solid '   brand?.colours.secondary, 
                'border-image:focus': 'linear-gradient(to right, '   brand?.colours.primary   ', '   brand?.colours.secondary   ')'} : ''"
  >
  <label for="callbackName" class="form__label">Name</label>
</div>
  

Комментарии:

1. Еще лучше, если вы можете использовать тему, подобную focus: BehaviorSubject<boolean> = new BehaviorSubject(false)

2. @SantiBarbat Не могли бы вы объяснить, почему? Тогда нам нужно было бы использовать async в шаблоне. Это может на самом деле усложнить его.

3. Все преимущества реактивного программирования

4. @SantiBarbat: Реактивный ради реактивного — не очень хорошая причина. Есть места, где наблюдаемые предоставляют очевидное преимущество перед синхронными данными. Это не то место, где излишне вводить наблюдаемое.