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

Angular 6中DevExpress dxSelectBox自定义Store不显示选中值问题

看起来你遇到的问题是dxSelectBox没法正确显示已选中的值,我帮你分析下原因和解决办法:

问题根源

核心问题出在绑定值的类型和组件配置不匹配:

  • 你给dxSelectBox设置了valueExpr: 'id',这就告诉组件:我要绑定的是数据源项里的id字段值(也就是数字类型,比如123)。
  • 但你的formData里item.person是一个完整的对象{ id: 123, name: 'John' },组件没法把这个对象和valueExpr指定的id值做匹配,所以就算byKey返回了正确数据,组件也不知道这是对应选中项。
两种解决方案

方案1:调整绑定值为id(推荐,更符合组件设计)

直接把item里的person字段改成对应的id数值,而不是完整对象:

// home.component.ts中修改item的定义
item = { person: 123 }; // 用id值和valueExpr对应

这样组件会自动用这个id调用byKey方法获取对应数据,然后通过displayExpr显示name字段,就能正常显示选中值了。

方案2:保持绑定完整对象(适合业务需求必须绑定对象的场景)

如果你的业务逻辑需要item.person是完整对象,那需要调整组件配置:

  1. 把valueExpr设为null,告诉组件绑定的是整个数据源项对象:
editorOptions = {
  displayExpr: 'name',
  valueExpr: null, // value为整个对象
  dataSource: null
};
  1. 给数据源配置key字段,让组件知道怎么识别对象的唯一性:
this.editorOptions.dataSource = new DataSource({
  load: function (loadOptions) {
    // 原加载逻辑不变
    const promise1 = new Promise(function (resolve, reject) {
      setTimeout(function () {
        console.log('resolving', vm.items);
        resolve( { data: vm.items } );
      }, 3000);
    });
    return promise1;
  },
  key: 'id', // 指定id作为对象的唯一标识
  byKey: function (key) {
    console.log('Getting Person', key);
    return new Promise((resolve) => {
      setTimeout(() => {
        // 根据key查找对应项,而不是固定返回John
        const target = vm.items.find(item => item.id === Number(key));
        resolve(target);
      }, 3000);
    });
  }
});

这样组件会通过key字段匹配绑定的对象和数据源中的项,就能正确显示选中值了。

额外优化建议

你的byKey方法目前固定返回John的数据,实际业务中最好根据传入的key参数动态查找对应项,这样不管选中哪个id,都能返回正确的结果,就像上面方案2里的写法那样。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:41:30