如今有个需求是:下拉框里面的数据是能够停用的,停用以后用户是不能再选择已经停用的数据,可是要以前已经选择了停用数据的没影响。javascript
个人解决思路为:在下拉框的展开事件中,将Enabled=false的过滤掉,保留启用的和没有Enabled字段的数据。这样若是用户没有去点击停用数据的combobox数据是不会丢掉,并且验证也能经过java
在EXT.JS下的具体实现为下面的代码(删除了一些与本实现无关的代码),expand方法为查询的时候调用的(查询方法去掉了),监听change事件,目的在于选择完以后将过滤掉的数据加回来mvc
要注意的是ide
1:Ext的filterBy事件会触发change事件,因此须要在filterBy时将change事件挂起ui
2:filterDisabled属性为mvc后台下发的,做用在于只有在须要的时候才启用过滤掉禁用的数据this
Ext.form.field.ComboBox.override({ useHiddenField: false, forceSelection: true, queryParam: "filter", clearIcon: true, filterDisabled: false, //是否启用过滤停用数据 //matchFieldWidth:false, initComponent: function () { var me = this; me.callParent(arguments); me.on("change", me.change, me); }, expand: function () { var me = this; if (me.filterDisabled) { //移除Enabled==false的数据 me.suspendEvent('change');//挂起change事件 me.getStore().filterBy(function (item) { return item.get("Enabled") !== false && item.get("field3") !== "False";//field3是grid中下拉框的启用字段 } ); me.resumeEvent('change');//取消挂起change事件 } me.callParent(arguments); }, change: function (obj,isDirty,e) { var me = this; if (me.filterDisabled) { me.getStore().clearFilter(); } }, onDestroy: function () { Ext.destroy(this.clearIconEl); this.callParent(arguments); } });
后台下发filterDisabled属性spa
/// <summary> /// 启用下拉框过滤禁用/停用的数据(form中使用) /// </summary> /// <param name="builder"></param> public static void EnableFilterDisabled(this ComboBox.Builder builder) { builder.Config("filterDisabled", true); }
在grid中的下发为code
效果以下orm
能够看到退货缘由列中被停用了的数据“买错了”已经被过滤掉了。blog
要注意的是grid中下发的属性是在列中的,还须要自行处理下