【问题标题】:Can't bind to 'Property X' since it isn't a known property of 'Child Component'无法绑定到“属性 X”,因为它不是“子组件”的已知属性
【发布时间】: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 输入'。

  1. 如果“rdn-input”是一个 Angular 组件并且它具有“rdnModel”输入,则验证它是该模块的一部分。
  2. 如果“rdn-input”是 Web 组件,则将“CUSTOM_ELEMENTS_SCHEMA”添加到该组件的“@NgModule.schemas”以禁止显示此消息。
  3. 要允许任何属性将“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


【解决方案1】:

我是为您链接的问题写下可接受答案的人。很久没有使用 Angular 了,所以请多多包涵,但我做了一些故障排除,可能已经解决了。

这绝对是一个继承的事情。我找到了this 一个相关问题的答案:

如果一个类从父类继承并且没有声明构造函数,那么它会继承父类的构造函数,以及该父类的参数元数据。

因为RdnInputComponent 定义了自己的构造函数,所以它没有继承基类的装饰器元数据。如果您删除构造函数,它会抱怨BaseRdnInput 没有自己的装饰器,并建议像@Yngve B-Nilsen 一样添加@Directive()。这似乎解决了RdnInputComponent 是否有构造函数的问题(参见stackblitz)。

或者,只需将继承的绑定属性添加到 RdnInputComponent 元数据的 inputsoutputs 似乎也可以正常工作 (stackblitz),如下所示:

@Component({
  selector: 'rdn-input',
  templateUrl: './rdn-input.component.html',
  inputs: ['rdnModel'],
  outputs: ['rdnModelChange']
})
export class RdnInputComponent extends BaseRdnInput {
// ...

希望有帮助!

【讨论】:

    【解决方案2】:

    你需要用@Directive() 来装饰你的基类——而不是@Injectable

    【讨论】:

    • 这个我在cmets里已经讲过了,我改了,但是没有区别。
    猜你喜欢
    • 2016-12-21
    • 2019-10-10
    • 2023-02-01
    • 2017-09-17
    • 2017-02-03
    • 2017-02-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多