为什么每次导航到组件时都会在 angular 中调用构造函数和 ngOninit?

why every time constructor and ngOninit is called in angular when navigate to component?

** 1 .假设我有导航栏,并且导航栏主页和登录中有选项卡 首先,当我为 home 提供服务时,在其构造函数内部调用了 home 组件,并且还调用了 ngOninit。假设现在我导航到登录组件,这也调用了它的构造函数和 ngOninit 。现在,如果我再次导航回主页,为什么又调用了构造函数和 ngOninit
2. 我正在尝试在家庭组件中制作一个网络应用程序,我从家庭 ngOninit 内的 firebase 获取数据。因此,当初始应用程序加载时,它会从 firebase 获取数据。如果我再次从登录组件导航回主组件,主组件调用 ngOninit 并再次点击获取服务方法,然后需要完全应用程序重新加载是否有任何解决方法。请给我解决方案**

如果不想在数据已经存在时调用服务,我相信可以通过在 ngOninit 中进行简单的条件检查来实现。

ngOninit() {
  if(!this.data.length){
  // Do the service call here
 }
}

仅当数据数组为空时才会调用该服务

您必须了解的基本内容是 angular 是一个 SPA(单页应用程序),具有组件的生命周期挂钩,可以提供开发人员或编码人员可以利用和使用的方法 his/per 目的。

因为每个组件都是一个class,所以肯定组件被调用的时候,构造函数也会被调用。根据 NgOnInit 的定义,它也会如此。

我们针对您的问题的解决方法是实施共享服务。

有一项服务可以存储您从 firebase 获取的数据。 当您从初始组件导航并返回时,在 ngOnInit() 挂钩中,尝试查看共享服务是否已经具有此数据。 如果没有数据,这意味着这是第一次加载(或重新加载)并且必须从 firebase 获取数据。如果有数据,说明已经取数据并保存了数据,我们不需要再取数据。

示例:

import { Injectable } from '@angular/core';
import { BehaviorSubject } from "rxjs/BehaviorSubject";

@Injectable()
export class SharedService {

  dataFromFireBase: string;

  constructor() {
  }

  updateData(data) {
    this.dataFromFireBase = data;
  }
}

在组件中:

import { Component, AfterContentChecked } from "@angular/core";
import { SharedService } from "../../common/shared.service";

@Component({
  selector: "app-component1",
  templateUrl: "./component1.component.html",
  styleUrls: ["./component1.component.css"]
})
export class Component1Component implements AfterContentChecked {
  dataFromFB;
  constructor(private sharedService: SharedService) {}

  ngAfterContentChecked() {
    if(!this.sharedService.dataFromFireBase) {
    // you fetch data from firebase into the variable 'dataFromFB'
    this.sharedService.updateData(this.dataFromFB);
    }
  }
}