如何访问 Angular Material 表特定行中的模板变量引用?(角 7)

Chr*_*nus 1 html javascript typescript angular-material angular

我目前正在尝试实现以下行为的更复杂版本,但由于我要到星期一才能访问我的项目,因此我将使用 Angular Material 教程中的更改示例进行简化。

Angular Material 表中填充了来自字符串数组的数据。数据显示在第一列的输入字段中。每行的第二列是一组按钮,当按下这些按钮时,会更改其行输入的内容。

例子

我试图通过使用模板引用变量来识别输入元素,但它总是显示为未定义。所以我假设 Angular Material 的表在我背后做一些改变所述变量范围的事情。

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

    <ng-container matColumnDef="inputColumn">
        <th mat-header-cell *matHeaderCellDef> No. </th>
        <td mat-cell *matCellDef="let element">
            <input #inputRef placeholder="{{element.name}}">
        </td>
    </ng-container>

    <ng-container matColumnDef="buttonColumn">
        <th mat-header-cell *matHeaderCellDef> Name </th>
        <td mat-cell *matCellDef="let element">
            <button (click)="inputRef.value='Changed Element'">Change!</button>
        </td>
    </ng-container>

    <tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
    <tr mat-row *matRowDef="let row; columns: displayedColumns;"></tr>
</table>
Run Code Online (Sandbox Code Playgroud)

在我的实际项目中,数据将来自 API,还会有更多按钮用于启用输入、保存或放弃对其内容所做的更改等。但是如果我设法让这个例子工作,那么剩下的应该很简单。

任何帮助将不胜感激。

Fab*_*üng 5

例如,您可以通过使用ViewChildren访问表中的所有输入元素并通过id属性标识它们来解决此问题。

看看这个stackblitz,我在那里拼凑了一个快速解决方案。

基本上我在模板中所做的就是将matInput指令添加到您的input元素并通过id属性唯一标识每个元素(仅分配inputColumn当前行的变量element):

<mat-form-field>
  <input matInput id="{{element.inputColumn}}" placeholder="{{element.inputColumn}}">
</mat-form-field>
Run Code Online (Sandbox Code Playgroud)

在我们传递当前行的按钮上添加了一个函数调用element

<button mat-raised-button (click)="changeValue(element)">{{element.buttonColumn}}</button>
Run Code Online (Sandbox Code Playgroud)

在组件中,我们input使用matInput指令检索所有元素:

@ViewChildren(MatInput) matInputs: QueryList<MatInput>;
Run Code Online (Sandbox Code Playgroud)

然后在被按钮调用的函数中,我们matInput通过id对应于elementinputColumn值的搜索正确的:

changeValue(element: TableData) {
  const input = this.matInputs.find(matInput => matInput.id === element.inputColumn);
  input.value = 'Changed!';
}
Run Code Online (Sandbox Code Playgroud)

我确信还有其他方法可以解决这个问题,如果您有很多按钮/行,则不确定它的行为方式。