本篇中的组件主要有以下几个功能:
1. 当输入两位以上字符情况下,从后台数据库检索并且放在搜索框列表中展示;
2. 当选中搜索框列表中某个指定的单元后,选中的单元会以pill的方式展示在输入框中,同时输入框隐藏,列表选择框隐藏;
3. 删除选中的单元以后,输入框变成可用状态。
实现方式如下:
包打开的结构如下:
2. 创建svg.component,用于显示slds提供的icon
svg.component
1
2
3
4
5
svgRenderer.js
复制代码
1 ({
2 render: function(component, helper) {
3 var classname = component.get("v.class");
4 var xlinkhref = component.get("v.xlinkHref");
5 var ariaHidden = component.get("v.aria-hidden");
6
7 var svg = document.createElementNS("http://www.w3.org/2000/svg", "svg");
8 svg.setAttribute('class', classname);
9 svg.setAttribute('aria-hidden', ariaHidden);
10 svg.innerHTML = '';
11 return svg;
12 }
13 })
复制代码
3. selectedObjectEvent.evt:用于当搜索出来的列表选中某个指定的单元后,传递给父组件。
1
2
3
4. customLookUpResult.cmp:用于显示搜索出来的结果的每个单元的展示组件,当选中单元后触发上面的事件。
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
复制代码
customLookUpResultController.js
复制代码
1 ({
2 selectObject : function(component, event, helper){
3 var selectedObject = component.get("v.selectedObj");
4 var compEvent = component.getEvent("selectedObjectEvent");
5 compEvent.setParams({"objectByEvent" : selectedObject});
6 compEvent.fire();
7 }
8 })
复制代码
5. customLookUp.cmp :主要包括几部分主要内容:
根据传递过来的 object 的API Name获取Label动态显示搜索的 object的Label信息;
展示搜索按钮,搜索后触发controller的handler来控制后台结果集的展示;
搜索时spinner的展示和隐藏;
移除选中的单元后,启用输入状态等。
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
48
49
50
59
60
61
复制代码
customLookUpController.js
复制代码
1 ({
2 initialData : function(component,event,helper) {
3 var action = component.get('c.getObjectLabelByObjectName');
4 action.setParam('objName', component.get('v.objectType'));
5 action.setCallback(this, function(response) {
6 if(response.getState() === 'SUCCESS') {
7 component.set('v.objectLabel', response.getReturnValue());
8 }
9 });
10 $A.enqueueAction(action);
11 },
12
13 fetchResultHandler : function(component, event, helper) {
14 var keyWord = component.get("v.SearchKeyWord");
15 var resultListDiv = component.find(www.yunshengpt.com"searchRes");
16 if( keyWord.length > 2){
17 $A.util.addClass(resultListDiv, 'slds-is-open');
18 $A.util.removeClass(resultListDiv, 'slds-is-close');
19 helper.searchHelper(component,event,keyWord);
20 }
21 else{
22 component.set("v.searchObjList", null );
23 $A.util.addClass(resultListDiv, 'slds-is-close');
24 $A.util.removeClass(resultListDiv, 'slds-is-open');
25 }
26 },
27
28 clearSelectedHandler :function(component,event,heplper){
29
30 var pillTarget = component.find("lookup-pill");
31 var lookUpTarget = component.find("lookupField");
32
33 $A.util.addClass(pillTarget, 'slds-hide');
34 $A.util.removeClass(pillTarget, 'slds-show');
35
36 $A.util.addClass(lookUpTarget, 'slds-show');
37 $A.util.removeClass(lookUpTarget, 'slds-hide');
38
39 component.set("v.SearchKeyWord",null);
40 component.set("v.searchObjList", null );
41 },
42
43
44 selectedObjectHandler : function(component, event, helper) {
45
46 var selectedObject = event.getParam("objectByEvent");
47 component.set("v.selectedRecord" , selectedObject);
48 var pillDiv = component.find("lookup-pill");
49 $A.util.addClass(pillDiv, 'slds-show');
50 $A.util.removeClass(pillDiv, 'slds-hide');
51
52 var resultListDiv = component.find("searchRes");
53 $A.util.addClass(resultListDiv,www.078881.cn 'slds-is-close');
54 $A.util.removeClass(resultListDiv, 'slds-is-open');
55
56 var lookUpTarget = component.find("lookupField");
57 $A.util.addClass(lookUpTarget, 'slds-hide');
58 $A.util.removeClass(lookUpTarget, 'slds-show');
59
60 },
61
62 hideSpinner : function (component, event, helper) {
63 var spinner = component.find(www.huarenyl.cn'spinner');
64 var evt = spinner.get("e.toggle");
65 evt.setParams({ isVisible : false });
66 evt.fire();
67 },
68
69 showSpinner : function (component, event, helper) {
70 var spinner = component.find('spinner');
71 var evt = spinner.get("e.toggle");
72 evt.setParams({ isVisible : true });
73 evt.fire();
74 }
75
76 })
复制代码
customLookUpHelper.js
复制代码
1 ({
2 searchHelper : function(component,event,getInputkeyWord) {
3 var action = component.get(www.365soke.com"c.fetchObjectList");
4 action.setParams({
5 'keyWord': getInputkeyWord,
6 'objectName' : component.get('v.objectType')
7 });
8
9 action.setCallback(this, function(response) {
10 var state = response.getState();
11 if (state === "SUCCESS") {
12 var resValue = response.getReturnValue();
13 if (resValue.length == 0) {
14 component.set("v.Message", 'No Result Found.');
15 } else {
16 component.set("v.Message", 'Search Result As Follows.');
17 }
18
19 component.set("v.searchObjList", resValue);
20 }
21 });
22 $A.enqueueAction(action);
23 }
24 })
复制代码
6. 放在APP 里面调用
TestCustomLookUpApp.app
1
2
3
4
5
TestCustomLookUpAppController.js
1 ({
2 showInformation : function(component, event, helper) {
3 alert(component.get('v.selectedUser'www.honghgjpt.com).Id);
4 }
5 })
结果展示:通过组件可以直接根据selectedUser获取选中的User的Id等信息。
总结:篇中只是简单的进行封装功能,并且只允许单选,对于多选感兴趣的可以实现。改动的点不是很多。篇中有错误的地方欢迎指出,不懂的欢迎留言。