2017-06-13 49 views
2

由于某些使用情况,我需要在Angular2中扩展PrimeNG组件。为了打样紫袍,我选择使用DataTable,因为它很复杂。在Angular2中扩展PrimeNg组件

逐字复制粘贴@Component注释后,我说:

export class PPDataTable extends DataTable {}

在这一点上,我得到以下错误:No provider for DataTable。如果我在注释中将DataTable添加到providers数组中,则我的DataTable的内容为空。

因此我试着加入:{ provide: DataTable, useValue: PPDataTable },它产生了一些错误,如:TypeError: co.dt.isSorted is not a function。我尝试在新类中记录this.isSorted,它确实存在。

如何扩展这样的东西?

此外,有更好的解决方案来改变PrimeNg组件的选择器名称(以某种方式包装它)?

编辑

寻找更多一些通过调试堆栈,我发现在这之后:enter image description here

看来,而不是直接提供对象,我提供包含对象的数组,这是(根据我的猜测)错误的原因。如果我进入源代码并将其更改为dt[0].isSorted(),它可以工作!

如何直接提供对象?

回答

看来,如果我提供{ provide: DataTable, useExisting: PPDataTable }它的工作原理。

回答

5

尝试了这一点我的好朋友:

import { Component, forwardRef } from '@angular/core'; 
import { NG_VALUE_ACCESSOR } from '@angular/forms'; 
import { PrimeNgClassToExtend } from 'path'; 

const DATATABLE_VALUE_ACCESSOR: any = { 
    provide: NG_VALUE_ACCESSOR, 
    useExisting: forwardRef(() => MyClassThatIsExtending), 
    multi: true 
}; 

@Component({ 
    selector: 'my-class-extending', 
    providers: [DATATABLE_VALUE_ACCESSOR], 
    template: `` 
}) 
export class MyClassThatIsExtending extends PrimeNgClassToExtend { 
} 

我们使用NG_VALUE_ACCESSOR为了您的自定义控制与控制值访问连接到ngModel。

检查this tutorial也可以。

+0

我仍然得到了问题中所解释的TypeError。 – user1640736

+0

感觉好像我正确提供了'ExtendingClass',但由于某种原因,使用'@Inject(forwardRef((=)DataTable))public dt:DataTable'的组件无法访问'dt'上的函数。此外,即使我手动覆盖扩展函数上的方法也不起作用,但仍然未定义。 – user1640736

+0

@ user1640736尝试'构造函数(@Inject(forwardRef(()=> DataTable))dt){}'。 – SrAxi