gpt4 book ai didi

angular - 元素包含不起作用(Angular 2+,RxJS)

转载 作者:搜寻专家 更新时间:2023-10-30 21:32:53 24 4
gpt4 key购买 nike

这是我的代码。 https://stackblitz.com/edit/angular-tq2vaa

constructor(private host: ElementRef) {
}

get element() {
return this.host.nativeElement;
}

private editModeHandler() {
const clickOutside$ = 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)
)
}

这是它在控制台中打印的内容。如您所见,app-editable-component 包含目标 h3,但为什么 ans 为真???

cont

最佳答案

我试图测试您的代码,请参阅 here

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

更新

在你的 stackblitz 之后,我看到了发生了什么。我会尽量简单:

  1. 您点击 h3元素
  2. edit模式已激活(因此 h3input 取代)
  3. 点击事件被 document 捕获因为点击冒泡并且contains(h3)将返回 false (因为#2)
  4. switchMapTo(clickOutside$)被执行
  5. 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();
});
}

希望这对您有所帮助。

关于angular - 元素包含不起作用(Angular 2+,RxJS),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56854839/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com