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 相关文章推荐
层序遍历在ExtJs的TreePanel中的应用
Oct 16 Javascript
JS 实现导航栏悬停效果(续)
Sep 24 Javascript
Javascript基础教程之for循环
Jan 18 Javascript
详谈jQuery操纵DOM元素属性 attr()和removeAtrr()方法
Jan 22 Javascript
基于jquery实现省市联动效果
Nov 23 Javascript
JavaScript定时器制作弹窗小广告
Feb 05 Javascript
AngularJS监听ng-repeat渲染完成的两种方法
Jan 16 Javascript
layui前端框架之table表数据的刷新方法
Aug 17 Javascript
Vue前后端不同端口的实现方法
Sep 19 Javascript
Vue中函数防抖节流的理解及应用实现
Apr 24 Javascript
JS实现电脑虚拟键盘打字测试
Jun 24 Javascript
Vue如何跨组件传递Slot的实现
Dec 14 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正则替换函数preg_replace()报错:Notice Use of undefined constant的解决方法分析
2017/02/04 PHP
PHP操作MongoDB实现增删改查功能【附php7操作MongoDB方法】
2018/04/24 PHP
ThinkPHP5.0框架控制器继承基类和自定义类示例
2018/05/25 PHP
简单实用的PHP文本缓存类实例
2019/03/22 PHP
CI框架教程之优化验证码机制详解【验证码辅助函数】
2019/04/16 PHP
laravel入门知识点整理
2020/09/15 PHP
Open and Print a Word Document
2007/06/15 Javascript
JS中showModalDialog 的使用解析
2013/04/17 Javascript
浅谈javascript六种数据类型以及特殊注意点
2013/12/20 Javascript
JS 打印界面的CSS居中代码适用所有浏览器
2014/03/19 Javascript
jquery移动节点实例
2015/01/14 Javascript
jquery实现简单实用的弹出层效果代码
2015/10/15 Javascript
JQuery解析XML数据的几个简单实例
2016/05/18 Javascript
JS中innerHTML和pasteHTML的区别实例分析
2016/06/22 Javascript
浅析上传头像示例及其注意事项
2016/12/14 Javascript
jquery获取select,option所有的value和text的实例
2017/03/06 Javascript
jQuery用noConflict代替$的实现方法
2017/04/12 jQuery
使用JavaScript进行表单校验功能
2017/08/01 Javascript
Angular 4中如何显示内容的CSS样式示例代码
2017/11/06 Javascript
使用classList来实现两个按钮样式的切换方法
2018/01/24 Javascript
详解vue的数据劫持以及操作数组的坑
2019/04/18 Javascript
[05:03]显微镜下的DOTA2第十期——Ti3豪之超神幽鬼
2014/06/23 DOTA
python实现无证书加密解密实例
2014/10/27 Python
python MysqlDb模块安装及其使用详解
2018/02/23 Python
Django利用cookie保存用户登录信息的简单实现方法
2019/05/27 Python
python 检查数据中是否有缺失值,删除缺失值的方式
2019/12/02 Python
python梯度下降算法的实现
2020/02/24 Python
Python获取浏览器窗口句柄过程解析
2020/07/25 Python
Python selenium爬取微信公众号文章代码详解
2020/08/12 Python
Python用access判断文件是否被占用的实例方法
2020/12/17 Python
html5+css3之动画在webapp中的应用
2014/11/21 HTML / CSS
化学专业自荐信
2014/05/28 职场文书
人事任命书怎么写
2014/06/05 职场文书
logback如何自定义日志存储
2021/08/30 Java/Android
分析Python list操作为什么会错误
2021/11/17 Python
Spring Boot接口定义和全局异常统一处理
2022/04/20 Java/Android