angular4实现带搜索的下拉框


Posted in Javascript onMarch 25, 2022

本文实例为大家分享了angular4实现带搜索的下拉框的具体代码,供大家参考,具体内容如下

思路:

1、站在巨人的肩膀上,确定了bootstrap-select的插件样式。确定了primeNG的DropDwon的模型。

2、分析自己的下拉框的需求,一步一步实现。

先看下下拉框的最后样式:

angular4实现带搜索的下拉框

第一步十分简单

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;
    }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JQuery 弹出框定位实现方法
Dec 02 Javascript
在jquery中处理带有命名空间的XML数据
Jun 13 Javascript
jquery ajax 调用失败的原因示例介绍
Sep 27 Javascript
a标签click和href执行顺序探讨
Jun 23 Javascript
jQuery实现自动调整字体大小的方法
Jun 15 Javascript
freemarker判断对象是否为空的方法
Aug 13 Javascript
jQuery检测滚动条是否到达底部
Dec 15 Javascript
基于JS判断iframe是否加载成功的方法(多种浏览器)
May 13 Javascript
javascript 作用于作用域链的详解
Sep 27 Javascript
vue组件编写之todolist组件实例详解
Jan 22 Javascript
jQuery中的类名选择器(.class)用法简单示例
May 14 jQuery
关于微信公众号开发无法支付的问题解决
Dec 28 Javascript
使用Canvas绘制一个游戏人物属性图
【js设计模式】SOLID五大设计原则
什么是SOLID
Vue3中toRef与toRefs的区别
Mar 24 #Vue.js
Javascript的promise,async和await的区别详解
Mar 24 #Javascript
一起来看看Vue的核心原理剖析
Mar 24 #Vue.js
手写Spirit防抖函数underscore和节流函数lodash
Mar 22 #Javascript
You might like
joomla jce editor 解决上传中文名文件失败问题
2013/06/09 PHP
php导入大量数据到mysql性能优化技巧
2014/12/29 PHP
分享十款最出色的PHP安全开发库中文详细介绍
2015/03/22 PHP
Yii视图操作之自定义分页实现方法
2016/07/14 PHP
同一个表单 根据要求递交到不同页面的实现方法小结
2009/08/05 Javascript
JQuery 学习技巧总结
2010/05/21 Javascript
jQuery新闻滚动插件 jquery.roller.js
2011/06/27 Javascript
javascript创建和存储cookie示例
2014/01/07 Javascript
Nodejs极简入门教程(二):定时器
2014/10/25 NodeJs
nodejs爬虫抓取数据乱码问题总结
2015/07/03 NodeJs
基于JavaScript实现通用tab选项卡(通用性强)
2016/01/07 Javascript
Websocket协议详解及简单实例代码
2016/12/12 Javascript
原生JS发送异步数据请求
2017/06/08 Javascript
express框架实现基于Websocket建立的简易聊天室
2017/08/10 Javascript
Javacript中自定义的map.js  的方法
2017/11/26 Javascript
Vue.js中的computed工作原理
2018/03/22 Javascript
vue+iview动态渲染表格详解
2019/03/19 Javascript
node.js如何操作MySQL数据库
2020/10/29 Javascript
[00:35]TI7不朽珍藏III——寒冰飞龙不朽展示
2017/07/15 DOTA
[48:29]2018DOTA2亚洲邀请赛3月30日 小组赛A组 LGD VS KG
2018/03/31 DOTA
详解Python中的元组与逻辑运算符
2015/10/13 Python
python 链接和操作 memcache方法
2017/03/04 Python
Python中使用支持向量机SVM实践
2017/12/27 Python
在Python函数中输入任意数量参数的实例
2019/07/16 Python
常用python爬虫库介绍与简要说明
2020/01/25 Python
解决tensorflow模型压缩的问题_踩坑无数,总算搞定
2021/03/02 Python
加拿大时装零售商:Influence U
2018/12/22 全球购物
内容编辑个人求职信
2013/12/10 职场文书
采购主管岗位职责
2014/02/01 职场文书
决心书标准格式
2014/03/11 职场文书
2014年五一活动策划方案
2014/03/15 职场文书
学生逃课检讨书1000字
2014/10/20 职场文书
安全守法证明
2015/06/23 职场文书
教师反邪教心得体会
2016/01/15 职场文书
再次探讨go实现无限 buffer 的 channel方法
2021/06/13 Golang
详解Golang如何优雅的终止一个服务
2022/03/21 Golang