Rumah > Soal Jawab > teks badan
Dalam projek Angular, saya ingin mengehadkan viewport IntersectionObserver kepada bahagian tertentu DOM.
Saya menggunakan id untuk menentukan elemen yang akan digunakan sebagai akar:
<div id="container"> <div class="page-list"> <infinite-scroll-page (scrolled)="onInfiniteScroll()"> ... </infinite-scroll-page> </div> </div>
Dalam komponen yang sepadan, saya mentakrifkan akar menggunakan getElementById
:
export class InfiniteScrollPageComponent implements OnDestroy { @Input() options: {root, threshold: number} = {root: document.getElementById('container'), threshold: 1}; @ViewChild(AnchorDirectivePage, {read: ElementRef, static: false}) anchor: ElementRef<HTMLElement>; private observer: IntersectionObserver; constructor(private host: ElementRef) { } get element() { return this.host.nativeElement; } ngAfterViewInit() { const options = { root: document.getElementById('container'), ...this.options }; console.log("options: ", JSON.stringify(options)); //...
Tetapi akar log masuk sentiasa null
.
Apa salah saya?
P粉0716024062024-03-29 16:31:45
Pertama sekali, operator spread anda adalah cara yang salah, jadi malangnya anda menggunakan @Input()
中的默认值设置后立即覆盖您的 root
untuk tugasan (yang, setahu saya, sebenarnya tidak digunakan sebagai input?).
Menyelesaikan masalah ini mungkin hanya perlu mengubah keadaan ini:
const options = { root: document.getElementById('container'), ...this.options };
sepatutnya
const options = { ...this.options, root: document.getElementById('container') };
Kedua, saya tertanya-tanya sama ada menggunakan @ViewChild
并将对容器元素的引用从父级传递到 InfiniteScrollPageComponent
lebih masuk akal.
parent.component.html
...
parent.component.ts
export class ParentComponent { @ViewChild('Container') containerRef: ElementRef; }
infinite-page-component.component.ts
export class InfiniteScrollPageComponent { @Input() containerRef: ElementRef; ngAfterViewInit() { const options = { ...this.options root: containerRef.nativeElement, }; }