游乐游手机版
首页/前端开发/文章详情

Extjs Combobox简洁美观的写法技巧

时间:2026-06-12 06:54
针对ExtJS中Combobox组件重复配置问题,通过封装BaseCombobox基类及其控制器,预置了数据源、渲染、事件等常用属性及请求逻辑。开发者仅需继承基类并配置少量差异化参数,即可快速构建下拉框,从而简化调用代码,显著提升可读性与维护性。

在ExtJS开发过程中,Combobox下拉选择框几乎是每个管理后台页面的标配组件。坦白说,每次使用都要反复配置displayFieldvalueFieldurlstore这些固定参数,重复劳动不仅拖慢效率,代码量增多后也容易出问题。忍无可忍之下,自己动手封装了一个通用基类,既能消除重复配置,又保留了足够的自定义空间。现在记录下来,方便日后查阅。

Extjs让combobox写起来简洁又漂亮

首先定义一个通用的BaseCombobox基类,将公共逻辑封装在内:

Ext.define('Admin.view.baseCmp.BaseCombobox', {
 extend: 'Ext.form.field.ComboBox',
 xtype: 'baseCombobox',
 editable: false,
 labelSeparator: ':',
 labelWdith: 0,
 triggerAction: 'all',
 labelAlign: 'right',
 //forceSelection: true, // 注意:如果开启,即使清空文字,失去焦点后仍然会选回上一次的记录
 autoSelect: true,
 selectOnfocus: true,
 valueNotFoundText: '',
 name:'',
 queryMode: 'local',
 url:'',
 displayField: '',
 valueField: '',
 requires:['Admin.view.baseCmp.BaseComboboxController'],
 controller: 'baseComboboxController',
 emptyIndex:-1, // 自定义属性:空值所在下标,-1 表示不添加空选项
 selectIndex:0, // 自定义属性:自动选择第几项(下标)
 params:null, // 自定义属性:请求参数
 listeners: {
  render: 'getComboData',
  scope: 'controller'
 },
});

与之配套的控制器实现如下:

Ext.define('Admin.view.baseCmp.BaseComboboxController', {
 extend: 'Ext.app.ViewController',
 alias: 'controller.baseComboboxController',
 getComboData: function (combo) {
  Ext.Ajax.request({
   url: combo.url,
   method :'POST',
   params:combo.params,
   success: function (response) {
    var dataJson = Ext.decode(response.responseText);
    if(dataJson.state != 200 || dataJson.data == null || dataJson.data.length == 0)
    {
     // 服务器返回错误,直接返回
     return ;
    }
    var data = dataJson.data;
    // 如果需要插入“全部”选项
    if(combo.emptyIndex >= 0)
    {
     var emp = {};
     emp[combo.displayField] = "全部";
     emp[combo.valueField] = "全部";
     Ext.Array.insert(data,combo.emptyIndex,[emp]);
    }
    var store = Ext.create('Ext.data.Store', {
     fields: Ext.Object.getKeys(data[0]),
     data: data
    });

    combo.setStore(store);
    // 如果指定了具体的值,优先选中
    if(combo.selectValue != null)
    {
     combo.select(combo.selectValue);
    }
    else
    {
     // 否则按 selectIndex 选个默认项,-1 表示最后一个
     if(combo.selectIndex == -1)
     {
      combo.select(data[data.length - 1][combo.valueField]);
     }
     else
     {
      combo.select(data[combo.selectIndex][combo.valueField]);
     }
    }
    // 注释掉的触发选中事件可以根据需要开启
    //combo.fireEvent('select', combo,store.getAt(combo.selectIndex));
   },
   failure: function (response) {
    // 请求失败,可根据实际情况处理
   }
  });
 }
});

有了这个基类,实际调用时配置量大幅减少。例如,创建一个类型下拉选择框只需极简代码:

{
    xtype: 'baseCombobox',
    name: "typeName",
    fieldLabel: "类型",
    displayField: 'typeName',
    valueField: 'id',
    emptyIndex:0,
    multiSelect:false,
    url:"/itemType/list",
    listeners:{
     select:'query'
    }
},

这样就将大部分重复性配置抽离到基类中。若某类业务场景频繁复用特定下拉框(如“类型”组合框),还可进一步封装为独立组件,使用时一行代码搞定:

xtype: 'itemTypeCombobox',

最终代码风格简洁清晰,既提升了可读性,也显著增强了后期维护的便捷性。

来源:https://www.jb51.net/article/102097.htm
上一篇ExtJS 4.2 Grid单元格合并实现技巧 下一篇AngularJS实现长按不触发点击事件并复制到剪贴板的方法
本站内容用于信息整理与展示,如有侵权或内容问题请及时联系处理。

相关推荐

补充同频道和同主题内容,方便继续浏览更多相关内容。

同类最新

继续查看同栏目最近更新的文章。

更多
Layui弹出层监听子页面键盘快捷键实现方法
前端开发 · 2026-07-06

Layui弹出层监听子页面键盘快捷键实现方法

子页面键盘事件监听需在DOM加载完成后绑定,父页无法直接监听子页按键,必须由子页自身监听后通过parent或postMessage通知父页。典型写法为子页调用父页已定义的关闭函数。需注意焦点状态、输入法及layui版本兼容性等陷阱。

Layui表单提交时携带当前页面Meta信息的实现方法
前端开发 · 2026-07-06

Layui表单提交时携带当前页面Meta信息的实现方法

Layui表单提交不会自动携带页面Meta信息,需在form on( submit )回调中手动读取meta内容并拼接到表单数据,注意后端字段映射及特殊字符编码,多meta时按需选取。

HTML5拖拽事件流状态转移监控调试
前端开发 · 2026-07-06

HTML5拖拽事件流状态转移监控调试

HTML5拖拽事件流易因漏监听或未调用preventDefault而中断。需掌握dragstart设置数据、dragover接受放置、drop触发条件等关键点。通过统一日志捕获事件上下文、识别常见状态丢失场景并配合可视化面板,可清晰定位拖拽过程断点。

uni-app实现小红书商品详情图卡片切换
前端开发 · 2026-07-06

uni-app实现小红书商品详情图卡片切换

通过手写touch事件与transform控制五张卡片,动态计算translateX、scale、opacity及z-index模拟层叠滑动效果。滑动距离超过80rpx触发切换,否则复位。图片仅渲染当前及前后两张,有效优化加载性能与渲染效率。

图像旋转倾斜与扭曲的Canvas像素矩阵变换
前端开发 · 2026-07-06

图像旋转倾斜与扭曲的Canvas像素矩阵变换

Canvas图像变形本质是操作坐标系,图像被动跟随。旋转需先平移原点至目标中心再旋转后复位;倾斜通过仿射变换矩阵实现;扭曲无原生API,可用分块模拟或转用WebGL。每次变换前保存状态,完成后恢复,避免坐标系偏移。