ngOnInit 不被注入类被实例化时

在 Angular 中,ngOnInit 是一个常用的生命周期钩子函数,通常用于在组件初始化时执行一些操作。然而,在某些情况下,可能会出现类未被注入但需要在该生命周期中使用的情况,这时我们需要做一些额外的处理。

问题描述

当我们在组件中定义了一个私有属性 myService,并希望在 ngOnInit 生命周期中使用它时,我们通常会将该服务注入到该组件的构造函数中:

------ - ---------- ------ - ---- ----------------
------ - --------- - ---- -----------------------

------------
  --------- -------------------
  ------------ ----------------------
  ---------- ----------------------
--
------ ----- ----------- ---------- ------ -
  ------------------- ---------- ---------- --

  ----------- ---- -
    -- -- --------- ---------
    -----------------------------
  -
-

但是,有时候我们可能需要在组件被实例化时手动创建 myService 的实例,而不是依赖注入。这种情况下,我们就不能像上面那样在构造函数中注入服务了。

例如,如果我们需要基于某个条件来决定是否创建 myService 实例,或者需要手动控制该实例的创建和销毁过程,那么我们就需要手动创建该实例,并在 ngOnInit 生命周期中使用它。

解决方案

要在不依赖注入的情况下使用服务,我们可以借助 Angular 的 Injector 类来手动创建服务实例,并将其作为组件的私有属性进行维护。

在组件中,我们可以通过 Injectorget() 方法来获取服务实例。需要注意的是,在手动创建服务实例时,我们需要指定该服务所依赖的其他服务或类的列表,以确保依赖关系正确。

以下是一个示例代码,演示了如何手动创建服务实例并在 ngOnInit 生命周期中使用它:

------ - ---------- --------- ------ - ---- ----------------
------ - --------- - ---- -----------------------

------------
  --------- -------------------
  ------------ ----------------------
  ---------- ----------------------
--
------ ----- ----------- ---------- ------ -
  ------- ---------- ----------

  ------------------- --------- --------- --

  ----------- ---- -
    -- ---- --------- --
    -------------- - -----------------------------

    -- -- --------- ---------
    -----------------------------
  -
-

总结

在一些特殊的情况下,我们可能需要在不依赖注入的情况下使用服务,并在组件初始化时执行一些操作。要做到这点,我们可以借助 Angular 的 Injector 类手动创建服务实例,并在组件中维护该实例的引用。此外,为了确保依赖关系正确,我们还需要在手动创建服务实例时指定该服务所依赖的其他服务或类的列表。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/11228