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

如何获取与设置BsMultiSelect控件的选项自定义属性值

BsMultiSelect自定义属性设置与获取方案

问题根因

你在options数组里定义的myattr属于自定义字段,不在bsMultiselect默认的选项配置识别范围内,库渲染选项DOM时不会自动把这类自定义字段挂到标签属性上,所以直接调用.attr('myattr')会返回undefined。能正常拿到text是因为text是库内置的标准字段,会被渲染为选项显示文本。

具体实现方法

两种方案都能满足需求,根据场景选即可:

方案1:配置属性渲染规则(需要把自定义属性挂到DOM上时用)

初始化组件时新增getOptionAttributes配置项,显式告诉组件需要把哪些自定义字段渲染为DOM属性,修改install方法里的初始化代码:

var install = function () {
  $languages.bsMultiSelect({
    options: options,
    getDisabled: function () { return disabled },
    getIsOptionDisabled: function (o) { return o.disabled },
    getIsOptionHidden: function (o) { return o.hidden },
    // 新增以下配置,返回需要挂载到选项标签的属性集合
    getOptionAttributes: function(opt) {
      return {
        myattr: opt.myattr
        // 后续加其他自定义属性直接在这个对象里补就行
      }
    }
  });
}

配置完成后组件渲染选项时会自动把myattr写到对应DOM标签上,你原来写的DOM遍历获取逻辑就能正常拿到值,不会再返回undefined。

方案2:直接读源数据(更稳定,推荐优先用)

所有选项数据本来就存在你定义的options源数组里,完全不需要绕DOM查询,直接从源数据过滤选中项即可,不会因为组件版本更新、DOM结构变动导致代码失效:

const itemName = [];
const attrData = [];
// 先拿组件实例同步UI选中状态到数据源,避免数据和UI不一致
const msInstance = $languages.data("DashboardCode.BsMultiSelect");
if (msInstance) msInstance.updateSelected();
// 遍历源数组取选中项数据
options.forEach(item => {
  if (item.selected) {
    itemName.push(item.text);
    attrData.push(item.myattr);
  }
})

动态修改自定义属性方法

运行时要修改自定义属性值,直接操作options数组对应项即可:

  • 如果用方案1(DOM挂载属性),修改完数组字段后调用组件实例的updateOptions()方法触发重绘,DOM上的属性就会同步更新
  • 如果用方案2(直接读源数据),修改完数组值直接使用即可,不需要额外操作

示例代码:

// 例:修改索引为0的选项的myattr值
options[0].myattr = "修改后的自定义属性值";
const msInstance = $languages.data("DashboardCode.BsMultiSelect");
if (msInstance) msInstance.updateOptions();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 17:21:26