代码之家  ›  专栏  ›  技术社区  ›  Jimmy Kane

9.服务的抽象类是否需要@injectable decorator?

  •  0
  • Jimmy Kane  · 技术社区  · 5 年前

    在升级到Angular9之后,一些服务扩展的抽象类会自动用 @injectable 如Angular 9 Migration guide中所述。

    我的应用程序一切正常。

    @可注射的 装饰工。

    Angular library module inject service with abstract class 有人建议把 摘自摘要。

    那我应该把装饰器拆了吗?

    这仅仅是一个角度上的“错误”添加到我的摘要装饰?

    而且,我注意到 @directive

    0 回复  |  直到 4 年前
        1
  •  5
  •   Chellappan வ    5 年前
        2
  •  1
  •   crimbo    4 年前

    要添加一些附加信息:

    Ivy中的一个关键概念是局部性,因此为了编译或重新编译一个组件,编译器不再扫描整个代码基-只有组件被重新编译;并且,组件的所有行为必须在编译类中捕获。 The link provided in other answers provides more details on the "why" .

    @Directive , @Component , @Injectable @NgModule )仅适用于基类使用角度特性的情况,例如它们实现了生命周期接口,如 OnInit OnDestroy . 如果基类不使用角度特性,就不需要角度装饰器。

    在Angular 9中,这个要求是可选的;但是不要从CLI升级放在那里的基类中删除decorator,因为这个要求在Angular 10中是非可选的。

        3
  •  1
  •   Matt    4 年前

    我不能在没有看到的情况下对您的代码进行特别的评论,但是作为一个一般性的观点,最好是 使用聚合而不是继承 . 换句话说,将基类重新设计为服务,然后将其注入派生类。

        4
  •  0
  •   Tim Consolazio    4 年前

    但是,我刚刚经历了一个序列,这似乎意味着没有办法为一个指令创建一个抽象基类,如果这个类使用角度特征(输入等)。需要重构。

    • 升级后,看到添加了空指令。
    • 无法编译。指令中需要元数据对象。

    我做了这一切,即使TS皮特哭了关于空白选择器,我关闭了一个tslint:禁用。。。

    …虽然不再显示为lint错误,但现在显示为生成错误(实际上是“请添加它!”)。因此,我添加了一个选择器,其中包含一些概念:它永远不会被使用,因为类是抽象的。

    …该类以前未添加到模块中。我没有编写原始的代码,而且很惊讶这从来没有出现在--prod构建中,但是读到以前的图形引擎,我发现它是可以原谅的,因为它具有全局可见性。但是Ivy没有,它是独立编译的,所以你需要decorator,我把它放进去了,没有模块的错误就出现了。所以我把它添加到相关模块中。

    ……没有利润。”换句话说,我猜你不能在一个模块中声明一个抽象类(至少,不是通常的“只把它添加到声明中”的方式)。

    所以最终,在没有考虑重构相当复杂的组件层次结构时,我只是从类定义中删除了抽象。

    我有点乱摆弄,但找不到直接绕过它的方法。

    所以在这里延伸答案:

    (尽管文档上说“你可以把选择器留空”,除非你想调整你的规则,但似乎你做不到)。