angular - 为什么在 Angular 2 的构造函数中编写初始化逻辑不是一个好习惯

标签 angular constructor ngoninit

为什么我们只在OnInit()方法中编写初始化逻辑,而不是在构造函数方法中?使用构造函数方法进行初始化有哪些副作用?请解释。

最佳答案

构造函数中未处理的错误将逃逸调用堆栈,并强制堆栈帧将调用堆栈向上跳转到第一个错误处理程序。当前调用堆栈上仍在构造的任何父组件也将崩溃。

@Component({..})
export class ExampleComponent implements OnDestroy {
   public constructor() {
      throw new Error("I crash the app!");
   }

   public ngOnDestroy() {
      console.error('I am never executed!');
   }
}

OnInit() 方法发生在 Angular 渲染循环的摘要循环内,并且独立于父组件进行调用。这里未处理的错误只会逃逸当前组件的摘要,父组件将继续工作而不会中断。

@Component({..})
export class ExampleComponent implements OnInit, OnDestroy {
   public ngOnInit() {
      throw new Error("I crash gracefully!");
   }

   public ngOnDestroy() {
      console.log('I am still executed!');
   }
}

发生错误的位置会影响组件的生命周期。如果ngOnInit中发生错误,ngOnDestroy方法将继续工作,但如果错误发生在构造函数中,组件将完全丢失。

关于angular - 为什么在 Angular 2 的构造函数中编写初始化逻辑不是一个好习惯,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58902898/

相关文章:

Angular5 服务调用不适用于 ngOnInit

angular - 使用初始化值触发 valueChange - angular2

html - angular 4 从右到左添加img onclick

angular - [ karma 服务器] : TypeError: Cannot read property 'range' of undefined - Angular Unit Testing in CI environment

css - Angular Directive(指令)显示顺序

twitter-bootstrap - 将 PrimeNG 与 Bootstrap 4 结合使用

c++ - 构造函数 - 内存分配失败

c++ - 为什么 X(X&) 可以调用两次?

angular - @Viewchild 在 ngOnInit 期间未初始化

c++ - 构造函数被调用了多少次?