有没有办法使组件在angular 2+;中成为单体;?

有没有办法使组件在angular 2+;中成为单体;?,angular,Angular,我需要使组件成为一个单吨,这样在应用程序中的任何地方我都可以使用它,而无需再次初始化它 如何做到这一点?您需要使用一个静态字段,在构造函数中为其分配第一个实例,并在已分配的情况下抛出(有人试图实例化第二个副本)。然后,您可以访问静态字段以在任何地方访问该实例。大致如下: export class MyClass { constructor() { if (MyClass.instance) { throw('Already instantiated

我需要使组件成为一个单吨,这样在应用程序中的任何地方我都可以使用它,而无需再次初始化它


如何做到这一点?

您需要使用一个静态字段,在构造函数中为其分配第一个实例,并在已分配的情况下抛出(有人试图实例化第二个副本)。然后,您可以访问静态字段以在任何地方访问该实例。大致如下:

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

        MyClass.instance = this;
    }

    static instance: MyClass;
}

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

这听起来像是一个骇人听闻的想法。使组件成为单例组件的唯一原因是这样数据就不会丢失,并且有一些方法可以在不使组件成为单例组件的情况下保存数据。例如,将数据存储在单例服务中,然后每次初始化组件时,从单例服务获取数据。或者使用存储解决方案,如ngrx

使用新的:

@Injectable({
  providedIn: 'root'
})

语法,该服务自动成为单例并按需加载,无需将其添加到提供者数组。这使得使用单例服务变得非常简单。

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

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

如何初始化组件?可注入组件是否也适用于您的情况,或者它是否需要是组件?可以使用viewcontainer动态创建组件。然而,这样做有其固有的缺点。您不希望组件在多个渲染中共享相同的属性。我不确定这是否是一个用例。我没有做过。但是你想达到什么目的呢?目的是什么?当加载组件时,我有一个包含一些html的组件,然后我做一些DOM操作,这样当组件需要应用程序中的任何地方时,就不需要再做了。另一个想法是:创建一个服务,在组件的ngOnInit中使用存储在服务中的变量初始化组件。如果只需要保留数据,则同意您的观点。我还需要保留html。在初始化过程中,您的数据应该使用*ngFor或甚至(如果绝对必要)使用jQuery或其他方法来驱动html。此代码现在可以保留组件实例。我如何在其他组件中重新呈现它?现在不是单例,不是吗?:)如果您不需要单例,只需要跟踪实例,请使用一些单例服务为您存储它们。