【问题标题】:Angular 9 update component inheritance decoratorAngular 9 更新组件继承装饰器
【发布时间】:2020-06-30 11:55:16
【问题描述】:

在 Angular 8 到 Angular 9 的更新过程中,更新脚本将组件装饰器添加到基类中。这记录在https://angular.io/guide/migration-undecorated-classes

在文档示例中,选择器是在基类装饰器中设置的。

但是如果你想在基类组件的子组件中有两个不同的选择器,你应该怎么做呢?

之前:

class BaseMenu {}

@Component({
  selector: 'a-menu',
  template: '<div></div>'
})
export class AMenu extends BaseMenu {}

@Component({
  selector: 'b-menu',
  template: '<div></div>'
})
export class BMenu extends BaseMenu {}

之后:

@Component(???)
class BaseMenu {}

@Component({
  selector: 'a-menu',
  template: '<div></div>'
})
export class AMenu extends BaseMenu {}

@Component({
  selector: 'b-menu',
  template: '<div></div>'
})
export class BMenu extends BaseMenu {}

组件装饰器需要一个“选择器”。

【问题讨论】:

    标签: angular


    【解决方案1】:

    使用您发布的链接中指定的 @Directive 装饰器。 @Directive 不需要选择器。

    @Directive()
    class BaseMenu {}
    
    @Component({
      selector: 'a-menu',
      template: '<div></div>'
    })
    export class AMenu extends BaseMenu {}
    
    @Component({
      selector: 'b-menu',
      template: '<div></div>'
    })
    export class BMenu extends BaseMenu {}
    

    【讨论】:

    • 这会导致 lint 错误“...应该以后缀指令结尾”。同样从指令中扩展组件似乎有点脏。
    • 禁用此部分的 lint 规则可以作为一种解决方法。感谢您的帮助。
    【解决方案2】:

    Angular 使用了大量的装饰器和元数据(@Component、@Directive、@NgModule,...)。此元数据和装饰器不会被子组件继承。因此,您可以只使用占位符选择器来填充它。请参阅https://blog.bitsrc.io/component-inheritance-in-angular-acd1215d5dd8

    @Component({
      selector: 'x-menu',
      template: '<div></div>'
    })
    class BaseMenu {}
    
    @Component({
      selector: 'a-menu',
      template: '<div></div>'
    })
    export class AMenu extends BaseMenu {}
    
    @Component({
      selector: 'b-menu',
      template: '<div></div>'
    })
    export class BMenu extends BaseMenu {}

    【讨论】:

    • 不幸的是,这会导致构建错误“1。如果 'a-menu' 是 Angular 组件,则验证它是否是该模块的一部分。”
    • 你检查过你的 NgModule 的声明了吗?
    • 在 app.module 声明中列出基础组件解决了这个问题。如错误中所述。我最初没有列出,因为在更新之前基类没有装饰器。添加了一个装饰器,即使只是用作基类,也必须将其添加到模块声明中。
    猜你喜欢
    • 1970-01-01
    • 2014-03-07
    • 2018-04-17
    • 2011-09-18
    • 2011-03-01
    • 2021-07-18
    • 2011-03-23
    • 2014-02-02
    • 2022-01-18
    相关资源
    最近更新 更多