即使配置了ngModel,Ng-Select组件仍无法正确绑定默认选中值
Ng-Select 多选默认选中不生效的原因与解决方案
问题根因
ng-select 对选中值和选项列表的匹配逻辑,默认采用严格内存引用匹配,也就是通过 === 比对两个对象的内存地址,而非逐属性比对对象值。
你当前代码里,selectedAttributes 数组中的两个对象,是初始化时独立声明的,哪怕和 sensorTypes 中的「Current」「Voltage」属性完全一致,因为内存引用地址不同,ng-select 会判定这两个对象不属于当前items列表的选项,因此不会触发默认选中渲染。
可落地的解决方法
方法1:赋值时直接引用items列表中的对象
不要单独新建选中值的对象,直接从已定义的sensorTypes数组中取出对应项赋值给selectedAttributes,从根源上保证对象引用和选项列表一致。
修改后的TS初始化逻辑:
ngOnInit(): void { this.sensorTypes = [ { label : "Power", value : "P"}, { label : "Current", value : "C"}, { label : "Voltage", value : "V"} ]; // 直接从sensorTypes中取对应项,保证引用一致 this.selectedAttributes = [ this.sensorTypes[1], // 对应Current项 this.sensorTypes[2] // 对应Voltage项 ] }
如果是接口回填场景,等接口返回的选项列表加载完成后,根据接口返回的选中值映射查找列表中对应的对象,再赋值给selectedAttributes即可。
方法2:配置compareWith自定义值匹配规则
如果选中值来自独立数据源、无法和选项列表保持对象引用一致,可以通过compareWith属性自定义匹配规则,告诉ng-select按照指定属性判定两个对象是否为同一项。
- 在组件TS中定义匹配函数,比如按照
value属性比对:// 只要两个对象的value值一致,就判定为同一项 compareSelected = (item1: any, item2: any) => item1?.value === item2?.value; - 在ng-select标签上绑定该匹配函数:
<ng-select [items]="sensorTypes" bindLabel="label" [multiple]="true" placeholder="Select" [compareWith]="compareSelected" [(ngModel)]="selectedAttributes"> </ng-select>
配置完成后,哪怕选中值是独立声明的对象,只要value属性和选项列表匹配,就能正常渲染默认选中项。
方法3:通过bindValue改为基础类型绑定
如果业务场景只需要选中项的value值、不需要完整对象,可以给ng-select配置bindValue="value",此时双向绑定的选中值会直接取项的value字段,比对逻辑转为基础类型的值匹配,不存在引用匹配问题。
对应修改的代码:
<!-- HTML模板 --> <ng-select [items]="sensorTypes" bindLabel="label" bindValue="value" [multiple]="true" placeholder="Select" [(ngModel)]="selectedAttributes"> </ng-select>
// TS逻辑 ngOnInit(): void { this.sensorTypes = [ { label : "Power", value : "P"}, { label : "Current", value : "C"}, { label : "Voltage", value : "V"} ]; // 配置bindValue后,选中值直接存储value字符串数组即可 this.selectedAttributes = ["C", "V"] }
内容的提问来源于stack exchange,提问作者Tan Yi Jing
相关产品推荐
相关产品推荐

