You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

mat-form-field内mat-chip列表结合mat-select时拖拽失效如何解决

问题根源

你拖拽后调整的数组和页面渲染chip的数组不是同一个,才会出现拖拽后回弹的情况,不属于组件兼容性问题。

需要修改的两处代码

1. 调整drop方法逻辑

你当前drop函数内修改的是全量可选配料数组toppings,但页面上渲染的chip数据源是表单控件存储的已选数组toppingsControl.value,修改前者不会作用于显示层,修改后还需要手动触发表单控件的更新:

drop(event: CdkDragDrop<Topping[]>) {
  // 拿到当前已选的数组
  const selectedToppings = this.toppingsControl.value as Topping[];
  // 调整已选数组内的顺序
  moveItemInArray(selectedToppings, event.previousIndex, event.currentIndex);
  // 重新给表单控件赋值触发变更检测
  this.toppingsControl.setValue(selectedToppings);
}

2. 可选优化:给cdkDropList绑定数据源

为了避免拖拽时索引计算异常,建议给mat-chip-list标签绑定对应的数据源:

<mat-chip-list
  cdkDropList
  [cdkDropListData]="toppingsControl.value"
  cdkDropListOrientation="horizontal"
  (cdkDropListDropped)="drop($event)"
>
额外注意点

你现有代码里onToppingRemoved方法的参数类型标注有误,传入的参数是Topping类型不是string,建议修正避免后续类型报错:

onToppingRemoved(topping: Topping) {
  const toppings = this.toppingsControl.value as Topping[];
  this.removeFirst(toppings, topping);
  this.toppingsControl.setValue(toppings);
}

内容的提问来源于stack exchange,提问作者mntblnk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 12:06:00