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 相关文章推荐
ExtJS 简介 让你知道extjs是什么
Dec 29 Javascript
javascript模版引擎-tmpl的bug修复与性能优化分析
Oct 23 Javascript
js的Prototype属性解释及常用方法
May 08 Javascript
javascript实现判断鼠标的状态
Jul 10 Javascript
javascript 动态修改css样式方法汇总(四种方法)
Aug 27 Javascript
js中使用使用原型(prototype)定义方法的好处详解
Jul 04 Javascript
Angularjs 实现分页功能及示例代码
Sep 14 Javascript
JS常用加密编码与算法实例总结
Dec 22 Javascript
jQuery鼠标移动图片上实现放大效果
Jun 25 jQuery
Nuxt.js之自动路由原理的实现方法
Nov 21 Javascript
浅谈Vue CLI 3结合Lerna进行UI框架设计
Apr 14 Javascript
详解将微信小程序接口Promise化并使用async函数
Aug 05 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中使用反射技术的架构插件使用说明
2010/05/18 PHP
php对二维数组按指定键值key排序示例代码
2013/11/26 PHP
php计算两个文件相对路径的方法
2015/03/14 PHP
js 图片缩放(按比例)控制代码
2009/05/27 Javascript
jquery操作复选框(checkbox)的12个小技巧总结
2014/02/04 Javascript
ExpressJS入门实例
2015/01/14 Javascript
JavaScript匿名函数用法分析
2015/02/13 Javascript
JavaScript中Null与Undefined的区别解析
2015/06/30 Javascript
js支持键盘控制的左右切换立体式图片轮播效果代码分享
2015/08/26 Javascript
纯JS打造网页中checkbox和radio的美化效果
2016/10/13 Javascript
Bootstrap基本组件学习笔记之input输入框组(9)
2016/12/07 Javascript
js仿淘宝商品放大预览功能
2017/03/15 Javascript
Vue Socket.io源码解读
2018/02/07 Javascript
vue2.0 elementUI制作面包屑导航栏
2018/02/22 Javascript
微信小程序实现手势滑动效果
2019/08/26 Javascript
微信小程序 select 下拉框组件功能
2019/09/09 Javascript
Vue 数据响应式相关总结
2021/01/28 Vue.js
python 运算符 供重载参考
2009/06/11 Python
Python编程语言的35个与众不同之处(语言特征和使用技巧)
2014/07/07 Python
python Django模板的使用方法
2016/01/14 Python
创建pycharm的自定义python模板方法
2018/05/23 Python
Python通过paramiko远程下载Linux服务器上的文件实例
2018/12/27 Python
在Python中字符串、列表、元组、字典之间的相互转换
2019/11/15 Python
Python判断字符串是否为空和null方法实例
2020/04/26 Python
Jupyter Notebook 安装配置与使用详解
2021/01/06 Python
HTML5 对各个标签的定义与规定:body的介绍
2012/06/21 HTML / CSS
aden + anais官方网站:婴儿襁褓、毯子、尿布和服装
2017/06/21 全球购物
控制工程专业个人求职信
2013/09/25 职场文书
机械设计制造专业个人求职信
2013/09/25 职场文书
离职证明标准格式
2014/09/15 职场文书
喝酒驾驶检讨书
2014/10/01 职场文书
毕业生个人自荐书
2015/03/05 职场文书
同步小康驻村工作简报
2015/07/20 职场文书
2019年销售部季度工作计划3篇
2019/10/09 职场文书
Pytorch使用shuffle打乱数据的操作
2021/05/20 Python
MySQL数据管理操作示例讲解
2022/12/24 MySQL