GridFilteringSelctl.js组件的搜索原理,具体到挂号界面的实现如下:
在 phis-web\resources\dojo\his\outpatient\register\main.js
有这样一段代码:
var req = {url: "/his/crm/patient/page-list", pageSize: 10, pageNo: 1, orgId:orgId}; var columns = [{label:"姓名", field: "name", width: "80px"}, {label:"性别", field:"sex", width:"40px", labelFunc:genderFormatter}, {label:"出生日期", field:"birthDate", width:"65px", labelFunc:dateFormatter}, {label:"住址", field:"familyAddr", width:"200px"}, {label:"身份证号", field:"idNum", width:"125px"}, {label:"门诊病历号", field:"opCaseNum", width:"80px"}]; patientIdWidget.set("searchAttr", "name"); patientIdWidget.set("labelAttr", "name"); patientIdWidget.set("columns", columns);// patientIdWidget.set("store", patientStore); patientIdWidget.set("allowInput", true);// patientIdWidget.set("queryExpr", "${0}"); patientIdWidget.set("request", req); patientIdWidget.set("endInput", " "); patientIdWidget.set("allowBackspace", true) patientIdWidget.set("promptMessage", "输入姓名或拼音码,按空格进行查询!");
下面是这段设置的涉及的官方API的解释:
自定义属性:
/**考虑到实时载入数据对后台产生压力,用户可以使用该属性来决定:当输入的搜索字符串遇到什么结尾时才会向后台发送请求,该字符只能一位的长度,多余部分会被忽略**/ _endInput: null,
/**向后台请求用的对象,包括url、pageSize、pageNo、search属性**/ _request: null,
所以组件表现的“按空格键触发搜索”实际上,是对_endinput赋值为“ ”实现的。
而在组件代码:
有改写FilteringSelect的一个方法,方法名为:
_startSearch: function(key){}
(函数体在:health-dojo-2.1.0\WebContent\resources\dojo-src\fly\form\GridFilteringSelectL.js)
可以看出该方法触发后,将检查最后一位是否为空格,如果为空格则去掉,并且展开dropDown并且执行_sendRequest进行查询。
下面是_starSearch的官方API解释,可以看出该方法就是官方组件中,将输入文本在Store中进行搜索的支持。
其实到了这里,我们就可以认为解析完毕了,抱着研究学习的心态,我们去看看dojo关于FilteringSelect的实现:
首先:_startSearch是在dijit/form/_AutoCompleteMixin下定义的,FilteringSelect相关的继承是
_SearchMixin->_AutoCompleteMixin->ComboBoxMixin->FilteringSelect
在_SearchMixin中有一个方法,该方法是输入触发事件的回调函数:
(因FilteringSelect继承了_TextBoxMixin.js,在这个内模块内有对该事件的注册代码,这里不贴出来了。)
_processInput: function(/*Event*/ evt){ // summary: // Handles input (keyboard/paste) events if(this.disabled || this.readOnly){ return; } var key = evt.charOrCode; var doSearch = false; this._prev_key_backspace = false; switch(key){ case keys.DELETE: case keys.BACKSPACE: this._prev_key_backspace = true; this._maskValidSubsetError = true; doSearch = true; break; default: // Non char keys (F1-F12 etc..) shouldn't start a search.. // Ascii characters and IME input (Chinese, Japanese etc.) should. //IME input produces keycode == 229. doSearch = typeof key == 'string' || key == 229; } if(doSearch){ // need to wait a tad before start search so that the event // bubbles through DOM and we have value visible if(!this.store){ this.onSearch(); }else{ this.searchTimer = this.defer("_startSearchFromInput", 1); } } },
红字部分其实执行了:
_startSearchFromInput: function(){ this._startSearch(this.focusNode.value); },
嗯...所以按键就会触发_starSearch方法。。然后就执行SendRequest,如果去看SendRequest还可以看到查询结果返回成功后,对dropdown的更新。
巴拉巴拉就清晰了。。
原标题:公司任务:解析一个二次封装dojo组件,进一步解析dijit/form/FilteringSelect的搜索功能。
关键词: