使用Atlas的客户端控件显示数据,并且通过DataView和自定义DataFilter,实现数据的过滤,从而实现字典的联动选择
项目中用Atlas客户端控件,实现了一个字典代码选择的功能页面。具体的功能就是在客户端使用三个ListView显示数据,数据源使用DataSource从Server端的WebService中读取数据,最多支持三级的联动字典选择。(关于使用ListView,dflying那里有,我就不献丑了)
由于不想频繁的从Server上读取数据,所以决定一开始就把数据全部读取到客户端,也因此需要通过DataView对要显示的数据进行必要的过滤,也就是要使用DataFilter。我的要求时用户在点击上级字典项目的时候,动态设置Filter的value,过滤条件为下级字典项目的编码前面几位=上一级的字典项目编码 这样经过过滤之后最终实现最终下级代码字典显示根据上一级字典的选择来过滤。可是Atlas自带的PropertyFilter的数据过滤条件是相应属性和value的完全相等,这肯定是不能满足需要的,怎么办?
自己动手,丰衣足食,咱自己写一个不就完了!起初设想的很简单,既然Atlas脚本扩展支持继承,那么我只要继承PropertyFilter,这样别的辅助功能根本不需要改动,我只需要重写其中的filter函数就可以了。很快写完代码,一测试,总是报错说我的类的tag标记没有注册,校对多边不得其果,这是怎么回事儿!于是打开Atlas.js仔细看看吧,这才发现PropertyFilter是sealed class,不能继承!Why?!想不通,干脆把它的代码完全复制一份,然后替换一下名字和filter函数,我也注册成Sealed class :) !保存好文件,试运行了一下,搞定。
下面就是我实现的Sys.Data.PropertyFilterEx,如果对您有用,请随意取用。
Sys.Data.PropertyFilterEx
Sys.Data.PropertyFilterEx = function() {
Sys.Data.PropertyFilterEx.initializeBase(this, [false]);
var _property, _value;
this.get_property = function() { return _property; }
this.set_property = function(name) { _property = name.rTrim(); this.raisePropertyChanged('property'); }
this.get_value = function() { return _value;}
this.set_value = function(value) { _value = value.rTrim(); this.raisePropertyChanged('value');}
this.filter=function(item) { var dest,p;p=this.get_property();
if (Sys.ITypeDescriptorProvider.isImplementedBy(item)) { dest= Sys.TypeDescriptor.getProperty(item, p); }
else {dest=item[p];} dest=dest.rTrim();if(dest.indexOf(_value)!=0)return false;if(dest.length>_value.length){return true;} else return false; }
this.getDescriptor = function() {var td = Sys.Data.PropertyFilterEx.callBaseMethod(this, 'getDescriptor');
td.addProperty('property', String); td.addProperty('value', String); return td; }
}
Sys.Data.PropertyFilterEx.registerSealedClass('Sys.Data.PropertyFilterEx', Sys.Data.DataFilter);
Sys.TypeDescriptor.addType('script', 'propertyFilterEx', Sys.Data.PropertyFilterEx);