cari

Rumah  >  Soal Jawab  >  teks badan

Punca IntersectionObserver menggunakan getElementById sentiasa batal

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粉501683874P粉501683874275 hari yang lalu423

membalas semua(1)saya akan balas

  • P粉071602406

    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,
        };
      }

    balas
    0
  • Batalbalas