0

I've coded this html:

<p-table #usersTable ...>
<p-table>

I'm trying to pick up this element in order to create an observable on onLazyLoad event:

@ViewChild('usersTable')
private usersTable: ElementRef;

In order to create observable:

public ngAfterViewInit() {
    let lazyTable$ = Observable
        .fromEvent(this.usersTable.nativeElement, 'onLazyLoad')
        .pipe(debounceTime(300));
}

Nevertheless, this.usersTable is undefined.

By other hand, I not sure at all, of having observable event creation correctly.

I've used

@ViewChildren(DataTable) private usersTable: QueryList<DataTable>;

Nevertheless, when a change is made query.length is always 0:

let lazyClick$ = this.usersTable.changes
    .pipe(
        filter((query: QueryList<DataTable>) => {
            return query.length > 0;
        }),
        map((query: QueryList<DataTable>) => {
            return query.first;
        }),
        switchMap((table) => {
            return table.onLazyLoad.asObservable();
        })
    );

Any ideas?

Jordi
  • 20,868
  • 39
  • 149
  • 333

2 Answers2

1

Has you've comment that your table is inside a div with an *ngIf, you can use set content to get the reference for your table.

@ViewChild('usersTable') set content(usersTable: ElementRef) {
  if (usersTable) {
    let lazyTable$ = Observable
        .fromEvent(this.usersTable.nativeElement, 'onLazyLoad')
        .pipe(debounceTime(300));
  }
}

This way, this function will execute on each change to *ngIf condition change, meaning when your table gets shown or hidden.

benshabatnoam
  • 7,161
  • 1
  • 31
  • 52
1

I can Create Observable from lazyLoad event like this.

import { Table } from 'primeng/table';

  @ViewChild('usersTable') set content(usersTable: Table) {
    if (usersTable) {
      let lazyTable$ = usersTable.onLazyLoad.pipe(debounceTime(300));
      }
    }

S.Hashiba
  • 615
  • 7
  • 15