<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
本文範例為大家分享了angular4實現帶搜尋的下拉框的具體程式碼,供大家參考,具體內容如下
1、站在巨人的肩膀上,確定了bootstrap-select的外掛樣式。確定了primeNG的DropDwon的模型。
2、分析自己的下拉框的需求,一步一步實現。
先看下下拉框的最後樣式:
第一步十分簡單
1)、由於之前看過下拉框的外掛的css樣式程式碼。於是乎直接把樣式檔案,拷過來。再把相應的的html原始碼拿過來,直接拷貝。
2)、由於只需要搜尋功能的這塊樣式,其餘的css樣式全部刪掉,減少無用的程式碼。
3)、繼續分析需求,分析已經做到的,尚未沒有做到的。
發現尚未做到的功能還有:
(1)下拉框的開啟關閉。
(2)點選下拉框之外,下拉框關閉。
(3)搜尋輸入框輸入文字達到相應的過濾功能。
(4)點選下拉框的選項,給上面的 輸入框賦值。
(1),(2)的功能涉及到樣式的問題。一開始自己是利用[ngClass]指令來完成(1)功能的,但是(2)個功能卡殼了。原bootstrap-select的外掛利用了 data-toggle=dropdown來完成 open類的新增的。但是自己的[ngClass]各種行不通,雖然我可以用*ngIf來完成功能,但是程式碼太多了,成本高。於是探索開始:
最開始我是在ts裡監聽了document的click事件,但是因為匿名函數的問題行不通了。果斷放棄了。
無奈之在ts裡做了對element元素的class屬性判斷。根據介面的class屬性,做判斷,給element元素新增或者去掉class屬性。這樣就完成了第一個功能和第二個功能。
第三個功能比較簡單,直接利用元素的click事件,賦值即可。
第4個功能,由於有primeNG原始碼,對過濾這塊的功能還是很簡單實現的。直接拷貝primeNG的原始碼即可。
相應的程式碼片段
html程式碼
<div class="btn-group bootstrap-select fit-width" #menu> <button type="button" class="btn dropdown-toggle btn-default" data-toggle="dropdown" (click)="activeDrop(menu)" > <span id={{selectValue.id}} class="filter-option pull-left" >{{selectValue.value}}</span> <span class="bs-caret"><span class="caret"></span></span> </button> <div class="dropdown-menu open" > <div class="bs-searchbox"> <input type="text" class="form-control" (input)="onFilter($event)"> </div> <ul class="dropdown-menu inner" > <li><a class="active" (click)="activeValue(menu)">——請選擇——</a></li> <li *ngIf="optionsToDisplay.length==0"><a>沒有匹配的項</a></li> <li *ngFor="let item of optionsToDisplay,let i=index"><a id={{item.id}} (click)="activeValue(menu)">{{item.value}}</a></li> </ul> </div> </div>
ts初始化程式碼
export class DropDownComponent implements OnInit { selectValue = new SelectData("", "——請選擇——") active = "false"; @Input() data = new Array(); filterValue = ""; optionsToDisplay = new Array(); filterBy = "value"; constructor(private inputhandler: InputHandler, private objectutils: ObjectUtils) { } ngOnInit() { console.log(this.data); this.optionsToDisplay = this.data.concat(); }
ts中用到的實體類程式碼
export class SelectData { id: string; value: string; constructor(id: string, value: string) { this.id = id; this.value = value; } }
開啟關閉下拉框程式碼
activeDrop(e: HTMLElement) { console.log(this.data); if (e.classList.contains("open")) { e.classList.remove("open"); } else { e.classList.add("open"); } } activeValue(e: HTMLElement) { this.selectValue.value = event.srcElement.textContent; this.selectValue.id = event.srcElement.id; if (e.classList.contains("open")) { e.classList.remove("open"); } else { e.classList.add("open"); } event.stopPropagation(); }
過濾程式碼1
onFilter(event): void { this.optionsToDisplay.length = 0; let inputValue = this.objectutils.trim(event.target.value.toLowerCase()); if (inputValue && inputValue.length) { this.filterValue = inputValue; this.optionsToDisplay = this.activateFilter(); } else { console.log(this.optionsToDisplay); this.filterValue = null; this.optionsToDisplay = this.data.concat(); console.log(this.optionsToDisplay); } } activateFilter() { let searchFields: string[] = this.filterBy.split(','); if (this.data && this.data.length) { return this.objectutils.filter(this.data, searchFields, this.filterValue); } }
過濾程式碼2
resolveFieldData(data: any, field: string): any { if(data && field) { if(field.indexOf('.') == -1) { return data[field]; } else { let fields: string[] = field.split('.'); let value = data; for(var i = 0, len = fields.length; i < len; ++i) { if (value == null) { return null; } value = value[fields[i]]; } return value; } } else { return null; } } filter(value: any[], fields: any[], filterValue: string) { let filteredItems: any[] = []; if(value) { for(let item of value) { for(let field of fields) { if(String(this.resolveFieldData(item, field)).toLowerCase().indexOf(filterValue.toLowerCase()) > -1) { filteredItems.push(item); break; } } } } return filteredItems; }
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45