有什么办法可以使角2+中的零件成为单例?

时间:2018-10-09 13:27:21

标签: angular

我需要将组件制成一吨,以便在应用程序中的任何地方都可以使用它而无需再次对其进行初始化。

这怎么办?

3 个答案:

答案 0 :(得分:0)

您需要使用一个静态字段来创建它,在构造函数中为其分配第一个实例,如果已经分配了它,则抛出该异常(有人试图实例化第二个副本)。然后,您可以访问静态字段以在任何地方访问实例。大概是这样的:

export class MyClass {
    constructor() {
        if (MyClass.instance) {
            throw('Already instantiated');
        }

        MyClass.instance = this;
    }

    static instance: MyClass;
}

然后在任何其他组件/服务中,您都可以访问MyClass.instance

答案 1 :(得分:0)

这听起来像个古怪的主意。使组件成为单例的唯一原因是不会丢失数据,并且有一些保存数据而不使组件成为单例的方法。例如,将数据存储在单例服务中,然后每次初始化组件时,从单例服务中获取数据。或者使用诸如ngrx之类的商店解决方案。

使用新的:

@Injectable({
  providedIn: 'root'
})

语法,该服务自动成为单例并按需加载,无需将其添加到provider数组。这使得使用单例服务超级容易。

答案 2 :(得分:0)

在组件中编写以下代码以使其成为单例。 在这里,共享服务是在根级别初始化的,因此在整个应用程序中只有一个实例。

constructor(public sharedService: SharedService) {
    if (!this.sharedService.myComponent) {
        this.sharedService.myComponent = this;
    } else {
        Object.assign(this, this.sharedService.myComponent);
    }
}