Как запустить функцию после того, как компонент стал виден в Angular 8?

Я хочу загружать данные, только если пользователь видит конкретный компонент, который загружает данные. Поэтому не загружайте, пока компонент не станет видимым.

У меня есть этот шаблон:

<button (click)="showMyCompontente()">Click me</button>
<app-other-component *ngIf="show"></app-other-component>

С этим кодом TypeScript:

export class MyComponent implements OnInit {
  show = false;

  ngOnInit() {
  }

  showMyCompontente() {
    this.show = !this.show;
  }
}

А суть вот в чем:

@Component({
  selector: 'app-other-component',
})
export class OtherComponent implements OnInit {

  ngOnInit() {
    this.load();
  }

  load() {
    // needs to load datas only if the user see the component
  }
}

Как добиться в OtherComponent запускать this.load() только если компонент виден пользователю? Я хочу снова перезагрузить данные, если пользователь скроет компонент и снова покажет его.

Мне нужно решение внутри компонента, чтобы обнаружить, что он стал видимым или исчез. Это потому, что у меня много компонентов, вызывающих друг друга во многих вариациях.

Какие хуки жизненного цикла Angular срабатывают только тогда, когда пользователь показывает компонент?


person netdjw    schedule 13.01.2020    source источник
comment
Вы пробовали ngAfterViewInit() ? В противном случае вам придется предоставить дополнительный код, чтобы уточнить, как вы показываете и скрываете компонент.   -  person Kokodoko    schedule 13.01.2020
comment
вы должны искать AfterViewInit   -  person D Pro    schedule 13.01.2020
comment
@Kokodoko да, но он тоже запускается при рендеринге родительского компонента.   -  person netdjw    schedule 13.01.2020


Ответы (1)


Я бы попробовал:

  • Добавление входного свойства с логическим типом к компоненту OtherComponent.
  • Передача значения show в свойство ввода, затем внутри компонента OtherComponent используйте ngOnChanges для обнаружения любых изменений в свойстве ввода и вызовите load() соответственно.
person Ngoc Vu    schedule 13.01.2020