使用DataSource元素的功能的角度垫表

时间:2019-08-22 08:27:54

标签: angular mat-table

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

  

错误TypeError:“ _ v.parent.context。$ implicit.getPeriodString不是   功能

我的表如下:

<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会随着时间的推移而变化,因此我不想手动调用{{1 }}每次两个变量之一发生变化。

感谢您阅读。

1 个答案:

答案 0 :(得分:1)

如果要访问在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");
}