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,还会有更多按钮用于启用输入、保存或放弃对其内容所做的更改等。但是如果我设法让这个例子工作,那么剩下的应该很简单。
任何帮助将不胜感激。
例如,您可以通过使用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对应于element的inputColumn值的搜索正确的:
changeValue(element: TableData) {
const input = this.matInputs.find(matInput => matInput.id === element.inputColumn);
input.value = 'Changed!';
}
Run Code Online (Sandbox Code Playgroud)
我确信还有其他方法可以解决这个问题,如果您有很多按钮/行,则不确定它的行为方式。
| 归档时间: |
|
| 查看次数: |
4613 次 |
| 最近记录: |