Я пытался проверить ваш код, см. здесь
import { Component, ElementRef } from '@angular/core';
import {fromEvent } from 'rxjs';
import { filter, take } from 'rxjs/operators';
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: [ './app.component.css' ]
})
export class AppComponent {
constructor(private host: ElementRef) {
this.editModeHandler();
}
get element() {
return this.host.nativeElement;
}
private editModeHandler() {
fromEvent(document, 'click')
.pipe(
filter(({ target }) => {
console.log('parent', this.element, 'child', target)
const ans = this.element.contains(target) === false
console.log(ans)
return ans
}),
take(1)
).subscribe();
}
}
, когда я нажимаю на тег <h3>
ans
показывает false
!я делаю то же самое, что и вы?я что-то упустил?
![enter image description here](https://i.stack.imgur.com/tj3pV.png)
ОБНОВЛЕНИЕ .
После твоего стекаблица я вижу, что происходит.Я постараюсь быть простым:
- Вы нажимаете на
h3
элемент edit
режим активирован (поэтому h3
заменяется на input
) - Событие click отлавливается
document
, потому что щелчок пузырится, а contains(h3)
вернет false
(из-за # 2) switchMapTo(clickOutside$)
выполнено view
режим активирован (действительно скорость, поэтому вы не увидите, как ввод появляется и исчезает).
Чтобы исправить это, вы можете остановить распространение, когда оно перехватывается хост-элементом.
private viewModeHandler() {
fromEvent(this.element, 'click').pipe(
untilDestroyed(this)
).subscribe((e) => {
console.log('clicked inside');
this.editMode.next(true);
this.mode = 'edit';
e.stopPropagation();
});
}
Надеюсь, это поможет.