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 相关文章推荐
JavaScript对数字的判断与处理实例分析
Feb 02 Javascript
使用纯javascript实现经典扫雷游戏
Apr 23 Javascript
JQuery.Ajax()的data参数类型实例详解
Nov 20 Javascript
Angular.js 实现数字转换汉字实例代码
Jul 14 Javascript
Vuejs第十二篇之动态组件全面解析
Sep 09 Javascript
JavaScript下拉菜单功能实例代码
Mar 01 Javascript
关于jquery form表单序列化的注意事项详解
Aug 01 jQuery
浅谈angular表单提交中ng-submit的默认使用方法
Sep 30 Javascript
vue 点击展开显示更多(点击收起部分隐藏)
Apr 09 Javascript
JS实现处理时间,年月日,星期的公共方法示例
May 31 Javascript
javascript实现fetch请求返回的统一拦截
Dec 22 Javascript
2020京东618叠蛋糕js脚本(亲测好用)
Jun 02 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
Windows下XDebug 手工配置与使用说明
2010/07/11 PHP
PHP多例模式介绍
2013/06/24 PHP
php基于socket实现SMTP发送邮件的方法
2015/03/05 PHP
Zend Framework入门教程之Zend_View组件用法示例
2016/12/09 PHP
PHP7内核CGI与FastCGI详解
2019/04/14 PHP
跟着JQuery API学Jquery 之二 属性
2010/04/09 Javascript
js中for in的用法示例解析
2013/12/25 Javascript
jquery自定义下拉列表示例
2014/04/25 Javascript
jQuery DOM删除节点操作指南
2015/03/03 Javascript
jQuery的load()方法及其回调函数用法实例
2015/03/25 Javascript
第二次聊一聊JS require.js模块化工具的基础知识
2016/04/17 Javascript
前端jquery部分很精彩
2016/05/03 Javascript
jquery判断input值不为空的方法
2016/06/05 Javascript
JavaScript必知必会(九)function 说起 闭包问题
2016/06/08 Javascript
微信小程序 video组件详解
2016/10/25 Javascript
不使用script导入js文件的几种方法
2016/10/27 Javascript
微信小程序-图片、录音、音频播放、音乐播放、视频、文件代码实例
2016/11/22 Javascript
快速入门Vue
2016/12/19 Javascript
vue实现简单实时汇率计算功能
2017/01/15 Javascript
JavaScript实现无穷滚动加载数据
2017/05/06 Javascript
mpvue 单文件页面配置详解
2018/12/02 Javascript
iSlider手机端图片滑动切换插件使用详解
2019/12/24 Javascript
简单了解Vue + ElementUI后台管理模板
2020/04/07 Javascript
如何搜索查找并解决Django相关的问题
2014/06/30 Python
python处理csv中的空值方法
2018/06/22 Python
Sanic框架蓝图用法实例分析
2018/07/17 Python
idea创建springMVC框架和配置小文件的教程图解
2018/09/18 Python
python对象与json相互转换的方法
2019/05/07 Python
汽车驾驶求职信
2013/10/25 职场文书
父亲八十大寿答谢词
2014/01/23 职场文书
入学生会自荐书范文
2014/02/05 职场文书
2014年教师业务学习材料
2014/05/12 职场文书
大型演出策划方案
2014/05/28 职场文书
2014年前台个人工作总结
2014/11/14 职场文书
大队委员竞选稿
2015/11/20 职场文书
详解Vue slot插槽
2021/11/20 Vue.js