typescript 角矩阵-自动完成发送后请求的整个对象

5kgi1eie  于 2023-02-25  发布在  TypeScript
关注(0)|答案(2)|浏览(131)

我有一个自动完成字段,在前端运行正常,但由于[value]="option",它将整个对象发送到后端。当我将其更改为[value]="option.id"时,表单可以正确提交,但一旦选择了一个选项,就会中断[displayWith]函数。由于displayWith使用对象更新输入,输入为空。
我可以修改什么来发送正确的id到后端,同时保留display函数?我尝试通过displayWith发送expenseCategory作为参数,但它不在for块中,因此我无法访问option对象。需要注意的是,这些是动态创建的输入,作为formArray的一部分。
这里是自动完成字段:

<mat-form-field appearance="outline" class="full-width-input">
  <mat-label>Expense Category</mat-label>
  <input type="text" aria-label="Assignee" matInput formControlName = "expense_category_id" [matAutocomplete]="auto">
  <mat-autocomplete #auto="matAutocomplete" [displayWith]="displayExpenseCategoryFn">
    <mat-option *ngFor="let option of filteredExpenseCategories[i] | async" [value]="option">
      {{option.category}}
    </mat-option>
  </mat-autocomplete>
</mat-form-field>

下面是displayWith函数:

displayExpenseCategoryFn(expenseCategory?: ExpenseCategory): string | undefined {
  return expenseCategory ? expenseCategory.category : undefined;
}
pu82cl6c

pu82cl6c1#

首先,我确信这是一个打字错误,但i是什么,在:

let option of filteredExpenseCategories[i]

其次,如果您还定义了一个模板,并且使用绑定{{option.category}},则不需要displayWith函数。
所以你可以直接回到[value]=”option.id“,这是最简单的方法。
如果您通过代码提交表单,那么您总是可以在数据被提交之前对其进行处理。
您还可以使用MatAutoComplete(https://material.angular.io/components/autocomplete/api)的(optionSelected)事件:
x一个一个一个一个x一个一个二个x
希望这个有用。

lf5gs5x2

lf5gs5x22#

好的。我是从几年前做的一个项目中想出来的(以为我以前解决过这个问题)
因此,我所做的是将displayExpenseCategoryFn绑定到控制器,这样我就可以搜索expenseCategories数组以提取类别名称并将其显示在输入字段中。

<mat-autocomplete #auto="matAutocomplete" [displayWith]="displayExpenseCategoryFn.bind(this)">
    <mat-option *ngFor="let option of filteredExpenseCategories[i] | async" [value]="option.id">
        {{option.category}}
    </mat-option>
</mat-autocomplete>

然后,我对displayWith函数做了以下更改。

displayExpenseCategoryFn(expenseCategoryId?: number): string | undefined {
    const index = this.expenseCategories.findIndex(expenseCategoryIndex => expenseCategoryIndex.id === expenseCategoryId);
    return expenseCategoryId ? this.expenseCategories[index].category : undefined;
}

相关问题