【发布时间】:2021-05-31 10:28:28
【问题描述】:
在我的项目中,我有一个泛型类和其他一些继承自该类的组件。
BaseRdnInput.ts:
@Injectable()
export abstract class BaseRdnInput implements ControlValueAccessor, Validator {
@Input() rdnModel?: any | Array<any>;
@Output() rdnModelChange: EventEmitter<any | Array<any>> = new EventEmitter<any | Array<any>>();
// many code after...
}
RdnInputComponent.ts:
@Component({
// tslint:disable-next-line:component-selector
selector: 'rdn-input',
templateUrl: './rdn-input.component.html'
})
export class RdnInputComponent extends BaseRdnInput implements OnInit, AfterViewInit {
// many code after...
constructor(public changeDetectorRef: ChangeDetectorRef) {
super(changeDetectorRef);
};
// many code after
}
那我在ContractComponent.html中使用这个组件:
<rdn-input [(rdnModel)]='headerEntity.saleNo'></rdn-input>
通过这行代码,我得到了这个错误:
无法绑定到“rdnModel”,因为它不是 'rdn 输入'。
- 如果“rdn-input”是一个 Angular 组件并且它具有“rdnModel”输入,则验证它是该模块的一部分。
- 如果“rdn-input”是 Web 组件,则将“CUSTOM_ELEMENTS_SCHEMA”添加到该组件的“@NgModule.schemas”以禁止显示此消息。
- 要允许任何属性将“NO_ERRORS_SCHEMA”添加到此组件的“@NgModule.schemas”。
在我升级之前它运行良好。我的问题与这个问题非常相似:Angular2 RC5:Can't bind to 'Property X' since it isn't a known property of 'Child Component'。我知道有一些设置可以避免这个错误,最重要的是:
检查我们是否将@input 添加到子类的属性或将 attr 添加到父类的biding 属性。
如果你看到我已经在 BaseRdnInput.ts: 中添加了@input。而且我不想使用 attr 因为它会阻止该属性被传递给嵌套指令。有没有办法通过这个?
【问题讨论】:
-
将超类装饰器更改为 @Directive 会发生什么?
-
@MikeOne 我为什么要这样做?我是怎么做到的?
-
抽象类上不需要
@Injectable() -
如果你想使用 Input 或 @Hostbinding 之类的东西,你需要一个具有较新版本 Angular 的装饰器。
-
Eshgi 只需将 Injectable 装饰器替换为 @Directive
标签: angular typescript inheritance angular-components