Angular mat-table 使用数据源元素的功能

Angular mat-table using function of DataSource element

我有一个 table 使用 mat-table。在其中一列中,我想使用来自 DatSource 的当前元素的函数的结果,但出现以下错误:

ERROR TypeError: "_v.parent.context.$implicit.getPeriodString is not a function

我的table如下:

<table mat-table [dataSource]="billingLines" class="mat-elevation-z8">

    <!-- Other columns comes here -->

    <ng-container matColumnDef="period">
        <th mat-header-cell *matHeaderCellDef> Période </th>
        <td mat-cell *matCellDef="let element; let i=index;">
            <p>{{element.getPeriodString()}}</p>
        </td>
    </ng-container>

    <tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
    <tr mat-row *matRowDef="let row; columns: displayedColumns;"></tr>
</table>

该组件具有数据源:

@Input() billingLines: ContractBillingLine[] = [];

还有一个ContractBillingLine是:

export class ContractBillingLine {
    constructor(
        public ligneTitle: string,
        public creditNote: boolean,
        public startPeriod: Date,
        public endPeriod: Date,
        public sumHT: number,
        public sumTVA: number,) {
    }

    public getPeriodString(): string {
        return "Du " + moment(this.startPeriod).format("dd/mm/yyyy") + moment(this.endPeriod).format("dd/mm/yyyy");
    }
}

我是 Angular 的新手,不确定我应该怎么做才能直接使用该功能?

我知道我可以使用一个变量,该变量将使用该方法的结果进行初始化,但我的 startPeriodendPeriod 会随着时间而改变,我不想手动调用 getPeriodString() 每次两个变量之一改变。

感谢阅读。

如果您想访问 ContractBillingLine 中声明的函数,您必须将 dataSource 中的每个对象初始化为 ContractBillingLine 的实例。简单地给 billingLines 一个 ContractBillingLine[] 类型是行不通的,因为你只是告诉打字稿 billingLines 将是 ContractBillingLine[] 类型,而没有实际的实例化发生。

export class ContractBillingLine {

    public ligneTitle: string,
    public creditNote: boolean,
    public startPeriod: Date,
    public endPeriod: Date,
    public sumHT: number,
    public sumTVA: number

    constructor(
        ligneTitle: string,
        creditNote: boolean,
        startPeriod: Date,
        endPeriod: Date,
        sumHT: number,
        sumTVA: number,
    ) {
        this.ligneTitle = ligneTitle,
        this.creditNote = creditNote,
        this.startPeriod = startPeriod,
        this.endPeriod = endPeriod,
        this.sumHT = sumHT,
        this.sumTVA = sumTVA
    }

    public getPeriodString(): string {
        return "Du " + moment(this.startPeriod).format("dd/mm/yyyy") + moment(this.endPeriod).format("dd/mm/yyyy");
    }
}

适用于此的示例 dataSource

const data: ContractBillingLine[] = [
    new ContractBillingLine('Title', true, new Date(), new Date(), 0, 0)
];

dataSource = data;

初始化可能会很乏味,只需在组件中声明该函数并将 element 传递给它会容易得多。

<p>{{getPeriodString(element)}}</p>

然后在你的组件中

public getPeriodString(element: ContractBillingLine): string {
    return "Du " + moment(element.startPeriod).format("dd/mm/yyyy") + moment(element.endPeriod).format("dd/mm/yyyy");
}