【问题标题】:angular6: I want my inherited component to have some propertys of the parent角度 6:我希望我继承的组件具有父组件的一些属性
【发布时间】:2019-04-12 21:40:06
【问题描述】:

我有一个表格,其中每个表格单元格都是组件的不同实例。根据数据(日期、文本、链接),我使用不同的组件。

由于这些组件有很多共同点,我介绍了一个 TableCellMasterComponent,它被所有其他类型的表格单元扩展。

我所有的组件都有相同的主机属性:

@Component({
  selector: 'td[app-text-col]',
  templateUrl: './text-col.component.html',
  styleUrls: ['./text-col.component.css'],
  host: {
    "[hidden]": "col.deactivated"
  },
  changeDetection: ChangeDetectionStrategy.OnPush
})
export class TextColComponent extends TableCellMasterComponent{
}

是否有可能以某种方式将其移至 TableCellMasterComponent?

我也很想给他们所有人一个上下文菜单。但正如我所见,在 Master 中添加 HTML 是不可能的。这是真的吗?

我可以将 changeDetection 移到 Master 上吗?

【问题讨论】:

  • 查看这篇关于 Encapsulation 的博文。也许你会找到你要找的东西。

标签: angular inheritance components angular6


【解决方案1】:

@Component 装饰器元数据不会被继承,因此您无法将某些内容移至基类。 @Input@Output 属性被继承。

主机属性有一个解决方案,您可以改用@HostBinding,这将被继承。例如你的绑定你可以这样做:

@HostBinding('hidden') get hidden(): boolean { return col.deactivated; }

【讨论】:

  • 我试过了,问题是 col.deactivate 属性会随着时间的推移而变化,而旧解决方案的列会对它做出反应。有了这个解决方案,他们不会。遗憾的是我无法绑定到 [hidden]
  • 您能否提供更多有关col.deactivated 来自何处的信息?我在StackBlitz 上做了一个简单的示例,它工作正常。我正在绑定到同一组件的属性。
  • 是的,但在您的示例中,它仅在启动时检查。以后没有变化。在我的示例中,col-object 作为 @Input 提交
  • 如果你按下切换按钮,它会改变。然后您可以实时看到它更新绑定并且内容被隐藏或显示。
  • 你说的很对,它也可以,我测试的时候一定很累,非常感谢
【解决方案2】:

我还创建了一个Stackblitz,这是我知道的唯一方法解决它们。感谢 AlesD 解决了您的第一个问题,解决问题所需要做的就是将 @Input() 添加到您在父元素中控制的可见性中。

上下文菜单的问题不那么简单。我很快尝试使用ngx-contextmenu 在我的stackblitz 中展示的一个选项是使用嵌套组件完成的。有一个很好的教程here

正如您所发现的,您必须在使用扩展或使用嵌套组件之间做出选择。在我的示例中,我同时使用了这两种方法,但根据情况使用其中一种可能更有意义:

  • 如果您的上下文菜单不同并且冗余不是什么大问题,请使用扩展,并在每个组件上手动构建上下文菜单
  • 如果上下文菜单都相同,我会完全放弃扩展并使用嵌套组件。您可以使用 @ViewChild 访问嵌套组件以访问您需要的属性。
  • 同时使用两者(如在我的示例中)主要用于演示,因为我不了解您的应用程序的整个上下文,但如果您可以将单元格抽象为使用通用接口或类,您可以传递给 contextMenu ,限制输入的数量,这可能对你有意义。

【讨论】:

  • 我也很想给你一个赏金,遗憾的是我只能这样做一次,非常感谢你的帮助
猜你喜欢
  • 2019-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-12
  • 1970-01-01
  • 2020-03-29
  • 2021-06-18
相关资源
最近更新 更多