在 Angular2 组件上使用 mixin 时缺少属性

Posted

技术标签:

【中文标题】在 Angular2 组件上使用 mixin 时缺少属性【英文标题】:Property missing when using mixin on Angular2 component 【发布时间】:2017-04-07 16:20:49 【问题描述】:

我需要能够从几个可重用的类组成一个 Angular 2 组件。因此,我正在尝试使用这些指南来实现 Mixins:

https://medium.com/@danny_mylian/mixins-as-class-decorators-in-typescript-angular2-8e09f1bc1f02#.jplhjv33t

https://www.typescriptlang.org/docs/handbook/mixins.html

这是我的代码的缩写版本。我有多个 mixin 类,所以我不能只扩展另一个类:

//date-of-birth-form.ts
export class DateOfBirthForm 
  dobMonth: number = null;
  . . .


//registration-form.component.ts
@Component(
  templateUrl: './registration-form.component.html',
)
@Mixin([DateOfBirthForm, ...])
export class RegistrationFormComponent implements DateOfBirthForm 
  . . .

我遇到的问题是:

[ts] 类“RegistrationFormComponent”错误实现 界面'DateOfBirthForm'。类型中缺少属性“dobMonth” 'RegistrationFormComponent'。

我做错了什么?基本上我需要做的是将表单组添加到父表单,但是一些表单组件调用 Web 服务或调用本地方法来计算我想封装在 Mixin 类中的数据。

【问题讨论】:

【参考方案1】:

查看您提供的page 上的示例:

@Mixin([Disposable, Activatable])
export class TableViewComponent implements Disposable, Activatable 
   // Disposable
   isDisposed: boolean = false;
   dispose: () => void;
   // Activatable
   isActive: boolean = false;
   activate: () => void;
   deactivate: () => void;
   constructor() 

看起来这种技术需要您添加已实现 mixin 的不同属性/方法的存根,以使编译器满意。

【讨论】:

我有多个 mixin 类。我会改变我的问题以反映这一点。 嗯。当我在RegistrationFormComponent 中放入dobMonth 的存根然后在类初始化后记录它时,它返回undefined,即使它在null 的mixin 中有一个值(或我设置的任何其他值) 也许还有另一种方法可以解决这个问题?我对 TypeScript 的经验有些有限。我想做的是扩展或实现定义我想要封装的所有属性和方法的类,以保持代码干燥,然后在父类中公开它们。我这里还有其他选择吗? 有趣的是,我能够获得一个属性来填充在实现类上定义的父级,但是数据不会绑定到模板。如果我删除 implements DateOfBirthForm,模板会按预期填充。看起来我可能只需要制作单独的组件并将它们与状态缝合在一起:/ Angular 2 组件通常倾向于组合而不是继承......继承通常可以以一种或另一种方式替换为组合。发人深省!【参考方案2】:

如您提到的链接中所述,“手动混合”有很多怪癖。缺少的存根只是其中之一,一旦您尝试添加私有/受保护的成员,您将获得更多。

TypeScript 2.2 提供了适当的 Mixin 类来解决这些问题。我在这里描述了如何将它们用于角度组件:

How to Extend/Inherit Angular2 component?

【讨论】:

以上是关于在 Angular2 组件上使用 mixin 时缺少属性的主要内容,如果未能解决你的问题,请参考以下文章

vue混入mixin

怎么理解mixins

Angular2 - 将文本框集中在组件加载上

如何在页面上多次重用自定义 Angular2 组件?

在 Vue.js 中使用Mixin

Angular2:使用DynamicComponentLoader动态插入的组件上的双向数据绑定