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 相关文章推荐
在js中单选框和复选框获取值的方式
Nov 06 Javascript
Javascript的时间戳和php的时间戳转换注意事项
Apr 12 Javascript
JS实现局部选择打印和局部不选择打印
Apr 03 Javascript
javascript实现类似百度分享功能的方法
Jul 27 Javascript
js仿3366小游戏选字游戏
Apr 14 Javascript
js实现动态创建的元素绑定事件
Jul 19 Javascript
微信小程序实现倒计时60s获取验证码
Apr 17 Javascript
TypeScript基础入门教程之三重斜线指令详解
Oct 22 Javascript
为什么要使用Vuex的介绍
Jan 19 Javascript
简单了解JavaScript中常见的反模式
Jun 21 Javascript
在nuxt中使用路由重定向的实例
Nov 06 Javascript
Vue Element-ui表单校验规则实现
Jul 09 Vue.js
使用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
PHP中其实也可以用方法链
2011/11/10 PHP
crontab无法执行php的解决方法
2016/01/25 PHP
PHP全功能无变形图片裁剪操作类与用法示例
2017/01/10 PHP
PHP下用Swoole实现Actor并发模型的方法
2019/06/12 PHP
javascript getElementsByClassName 和js取地址栏参数
2010/01/02 Javascript
js substr、substring和slice使用说明小记
2011/09/15 Javascript
文字溢出实现溢出的部分再放入一个新生成的div中具体代码
2013/05/17 Javascript
JS实现可改变列宽的table实例
2013/07/02 Javascript
js的隐含参数(arguments,callee,caller)使用方法
2014/01/28 Javascript
jquerymobile局部渲染的各种刷新方法小结
2014/03/05 Javascript
JS原型对象的创建方法详解
2016/06/16 Javascript
常用jQuery选择器汇总
2017/02/02 Javascript
在vue中安装使用vux的教程详解
2018/09/16 Javascript
vue项目引入Iconfont图标库的教程图解
2018/10/24 Javascript
nodejs中各种加密算法的实现详解
2019/07/11 NodeJs
Vue在chrome44偶现点击子元素事件无法冒泡的解决方法
2019/12/15 Javascript
vue相关配置文件详解及多环境配置详细步骤
2020/05/19 Javascript
python实现根据窗口标题调用窗口的方法
2015/03/13 Python
学生信息管理系统python版
2018/10/17 Python
python实现杨氏矩阵查找
2019/03/02 Python
python的turtle库使用详解
2019/05/10 Python
python tkinter图形界面代码统计工具(更新)
2019/09/18 Python
使用 tf.nn.dynamic_rnn 展开时间维度方式
2020/01/21 Python
Python转换itertools.chain对象为数组的方法
2020/02/07 Python
Python 实现网课实时监控自动签到、打卡功能
2020/03/12 Python
Python语法垃圾回收机制原理解析
2020/03/25 Python
使用Python实现将多表分批次从数据库导出到Excel
2020/05/15 Python
python 从list中随机取值的方法
2020/11/16 Python
python的setattr函数实例用法
2020/12/16 Python
女性时尚在线:IVRose
2019/02/23 全球购物
当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
2014/09/09 面试题
优质护理服务演讲稿
2014/05/07 职场文书
渠道运营商合作协议书范本
2014/10/06 职场文书
小学生勤俭节约倡议书
2015/04/29 职场文书
2015年街道办事处团委工作总结
2015/10/14 职场文书
优秀家长事迹材料(2016推荐版)
2016/02/29 职场文书