angular 实现下拉列表组件的示例代码


Posted in Javascript onMarch 09, 2019

需求:

angular 实现下拉列表组件的示例代码

方案一

最开始就是用最简单的方法,前台请求数据,然后通过select和option在页面上显示,但是写了一会儿发现出现了许多类似下面的重复的代码

// 初始化年级选项
initGradeOptions() {
  this.gradeService.getAll().subscribe((res) => {
    this.gradeOptions = res;
  }, () => {
    console.log('get gradeOption error');
  });
}
<nz-select nzPlaceHolder="请选择所属年级" formControlName="grade">
  <nz-option *ngFor="let grade of gradeOptions" [nzLabel]="grade.name"
       [nzValue]="grade"></nz-option>
</nz-select>

每写一个列表都要写请求它的数据的方法和模板中的内容,非常繁琐。

方案二

因为在项目中,不止一个地方用到了这样的列表,所以就想着把这些列表单独拿出来,写成组件。
这里就参考了朴世超组长的angular的输入与输出写了这个组件
思路大概如下:

angular 实现下拉列表组件的示例代码

ts:

@Input() defaultValue: Grade;            // 选中的值
@Output() selected = new EventEmitter<number>();  // 输出属性
datas: Grade[];                   // 所有数据

constructor(private gradeService: GradeService) {
}

// 请求所有的数据
ngOnInit() {
  this.gradeService.getAll().subscribe((res) => {
    this.datas = res;
  }, () => {
    console.log('error');
  });
}

// 当则内容更改时,将已选中对象的id弹射到父组件绑定的事件上
dataChange() {
  this.selected.emit(this.defaultValue);
}

html:

<nz-select nzPlaceHolder="所属年级" class="wide" [(ngModel)]="defaultValue" (ngModelChange)="dataChange()">
<nz-option *ngFor="let data of datas" [nzLabel]="data.name"
      [nzValue]="data"></nz-option>
 </nz-select>

ps: 默认选中的功能还在完善,待更新

思考

当我照着上面的套路继续写collegeList,majorList,klassList,以后还会有teacherList,studentList等等,这样不也形成了很多重复的代码吗?

于是我就想能不能设计一个组件:

我让它是什么列表,它就是什么列表。

然后我就寻找这几个组件的共性,发现它们请求数据的的特点:

  • 都是使用get请求
  • 返回的数据都是数组
  • url只有最后一项不同

那么,我只要传给组件一个url数组,就能根据url请求对应的数据,再生成相应的模板

方案三(失败)

angular 实现下拉列表组件的示例代码

angular 实现下拉列表组件的示例代码

子组件ts:

@Input() urls: String[][] = [];         // 保存传递过来的url
datas: String[][] = [];             // 保存查询结果
@Input() titles: String[][] = [];        // 保存提示语句
@Output() selectItems = new EventEmitter();   // 已选中的对象
index = 0;
items = [];

constructor(public dataService: DataService) {
}


ngOnInit() {
  this.getData(this.index);
}

getData(index: number): void {
  if (index < this.urls.length) {
    const url = this.urls[index];
    this.dataService.getAllData(url).subscribe((res) => {
      this.datas[index] = res;
      console.log(this.datas);
    }, () => {
      console.log('error');
    });
  }
}

dataChange(i: number) {
  console.log(this.items);
  this.selectItems.emit(this.items);
  this.getData(i + 1);
}

子组件html:

<nz-select [nzPlaceHolder]="titles[i]"
    style="width: 150px;"
    (ngModelChange)="dataChange(i)"
    [(ngModel)]="items[i]"
    *ngFor="let url of urls,let i = index">
<nz-option *ngFor="let item of datas[i]" [nzValue]="item" [nzLabel]="item.name">    
</nz-option>
</nz-select>

父组件ts:

url = ['Grade', 'College', 'Major'];
titels = ['年级', '学院', '专业'];

getSelectItems(event) {
  console.log(event);
}

父组件html:

<app-grade-list 
    [urls]="url" 
    [titles]="titels" 
    (selectItems)="getSelectItems($event)">
    </app-grade-list>

效果:

angular 实现下拉列表组件的示例代码

看起来还能用,但是再往后写就发现这样写有致命的缺陷。

  • 每一个下拉框都是根据url生成的,使用时需要查找url
  • 传给父组件的数据不知道数据与实体的对应关系
  • 当存在级联时,使用该方案难度高,且不易维护

总结

虽然这些下拉列表有一定的共性,并且可以抽象出一些公共的功能来实现,但本身设计略复杂,且使用效果并不好,最后还是放弃了第三个方案。

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

Javascript 相关文章推荐
身份证号码前六位所代表的省,市,区, 以及地区编码下载
Apr 12 Javascript
给Javascript数组插入一条记录的代码
Aug 30 Javascript
jQuery 解析xml文件
Aug 09 Javascript
JavaScript 判断指定字符串是否为有效数字
May 11 Javascript
你需要知道的10个最佳javascript开发实践小结
Apr 15 Javascript
基于JQuery的一句话搞定手风琴菜单
Sep 14 Javascript
JavaScript中pop()方法的使用教程
Jun 09 Javascript
javascript实现html页面之间参数传递的四种方法实例分析
Dec 15 Javascript
mvc中form表单提交的三种方式(推荐)
Aug 10 Javascript
js获取指定时间的前几秒
Apr 05 Javascript
Node.js对MongoDB数据库实现模糊查询的方法
May 03 Javascript
详解Node.JS模块 process
Aug 31 Javascript
Node.js动手撸一个静态资源服务器的方法
Mar 09 #Javascript
深入理解使用Vue实现Context-Menu的思考与总结
Mar 09 #Javascript
vue模块拖拽实现示例代码
Mar 09 #Javascript
Vue中的验证登录状态的实现方法
Mar 09 #Javascript
在NPM发布自己造的轮子的方法步骤
Mar 09 #Javascript
使用pm2部署node生产环境的方法步骤
Mar 09 #Javascript
Koa日志中间件封装开发详解
Mar 09 #Javascript
You might like
php环境配置 php5 mysql5 apache2 phpmyadmin安装与配置
2006/11/17 PHP
php 读写json文件及修改json的方法
2018/03/07 PHP
Laravel框架实现定时发布任务的方法
2018/08/16 PHP
JAVASCRIPT 对象的创建与使用
2021/03/09 Javascript
SyntaxHighlighter代码加色使用方法
2008/09/07 Javascript
javascript对象之内置对象Math使用方法
2010/04/16 Javascript
input禁止键盘及中文输入,但可以点击
2014/02/13 Javascript
js使用ajax读博客rss示例
2014/05/06 Javascript
jQuery操作JSON的CRUD用法实例
2015/02/25 Javascript
Bootstrap常用组件学习(整理)
2017/03/24 Javascript
Jquery中.bind()、.live()、.delegate()和.on()之间的区别详解
2017/08/01 jQuery
史上最全JavaScript常用的简写技巧(推荐)
2017/08/17 Javascript
vue文件树组件使用详解
2018/03/29 Javascript
一个基于react的图片裁剪组件示例
2018/04/18 Javascript
js中console在一行内打印字符串和对象的方法
2019/09/10 Javascript
JavaScript this关键字指向常用情况解析
2020/09/02 Javascript
[37:02]OG vs INfamous 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
python多重继承实例
2014/10/11 Python
python 寻找优化使成本函数最小的最优解的方法
2017/12/28 Python
Python实现将MySQL数据库表中的数据导出生成csv格式文件的方法
2018/01/11 Python
Python CVXOPT模块安装及使用解析
2019/08/01 Python
使用coverage统计python web项目代码覆盖率的方法详解
2019/08/05 Python
用Python调用win命令行提高工作效率的实例
2019/08/14 Python
python科学计算之narray对象用法
2019/11/25 Python
Flask中endpoint的理解(小结)
2019/12/11 Python
用于ETL的Python数据转换工具详解
2020/07/21 Python
节省高达65%的城市景点费用:Go City
2019/07/06 全球购物
Windows和Linux动态库应用异同
2016/04/17 面试题
技术经理的自我评价范文
2013/12/03 职场文书
老公爱的承诺书
2014/03/31 职场文书
党建工作先进材料
2014/05/02 职场文书
行政文员实习自我鉴定范文
2014/09/14 职场文书
领导班子群众路线与四风问题对照检查材料思想汇报
2014/10/11 职场文书
师德师风学习材料
2014/12/19 职场文书
夫妻吵架保证书
2015/05/08 职场文书
2015国庆节66周年标语
2015/07/30 职场文书