В angular вы должны использовать focusout
вместо blur
:
<input (focus)="field.show_options = true"
(focusout)="field.show_options = false"
type="text">
Кроме того, важно отметить, что событие focusout
запускается раньше, чем click
событие. Поэтому вам нужно заставить focusout
немного подождать, прежде чем изменить значение. Вы можете сделать это с помощью метода на стороне машинописного текста:
_setFocus(focus: boolean) {
if (!focus) {
// the 200ms here is a matter of trial and error process:
// very uncomfortable, but it's simple
setTimeout(() => (this.field.show_options = focus), 200);
} else {
this.field.show_options = true;
}
}
И в вашей HTML:
<input (focus)="_setFocus(true)"
(focusout)="_setFocus(false)"
type="text">
Демонстрация Stackblitz
Лично я чувствую себя некомфортно из-за setTimeout
в моем коде, но в этом случае, чтобы избежать его, если это возможно, потребуется более сложная настройка.