您的位置:首页 > 其它

公司任务:解析一个二次封装dojo组件,进一步解析dijit/form/FilteringSelect的搜索功能。

2016-09-09 10:20 435 查看
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的更新。

巴拉巴拉就清晰了。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: