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 相关文章推荐
Javascript &amp; DHTML 实例编程(教程)(三)初级实例篇1—上传文件控件实例
Jun 02 Javascript
用document.documentElement取代document.body的原因分析
Nov 12 Javascript
Jquery 模拟用户点击超链接或者按钮的方法
Oct 25 Javascript
jquery绑定事件不生效的解决方法
Feb 11 Javascript
js中的caller和callee属性介绍和例子
Jun 07 Javascript
jQuery增加自定义函数的方法
Jul 18 Javascript
jquery实现图片切换代码
Oct 13 Javascript
Vue.js bootstrap前端实现分页和排序
Mar 10 Javascript
JS 实现缓存算法的示例(FIFO/LRU)
Mar 20 Javascript
使用webpack搭建vue项目实现脚手架功能
Mar 15 Javascript
vue-element-admin 菜单标签失效的解决方式
Nov 12 Javascript
vue实现滚动鼠标滚轮切换页面
Dec 13 Vue.js
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中用hash实现的数组
2011/07/17 PHP
PHP常量使用的几个需要注意的地方(谨慎使用PHP中的常量)
2014/09/12 PHP
PHP编写RESTful接口
2016/02/23 PHP
编写PHP脚本清除WordPress头部冗余代码的方法讲解
2016/03/01 PHP
详谈php ip2long 出现负数的原因及解决方法
2017/04/05 PHP
jQuery的一些特性和用法整理小结
2010/01/13 Javascript
表单元素与非表单元素刷新区别详细解析
2013/11/06 Javascript
动态创建script标签实现跨域资源访问的方法介绍
2014/02/28 Javascript
js特殊字符过滤的示例代码
2014/03/05 Javascript
js读取被点击次数的简单实例(从数据库中读取)
2014/03/07 Javascript
对 jQuery 中 data 方法的误解分析
2014/06/18 Javascript
AngularJS 指令详细介绍
2016/07/27 Javascript
js实现消息滚动效果
2017/01/18 Javascript
JS动态添加的div点击跳转到另一页面实现代码
2017/09/30 Javascript
JS中用EL表达式获取上下文参数值的方法
2018/03/28 Javascript
vue.js 2.0实现简单分页效果
2019/07/29 Javascript
Element InputNumber计数器的使用方法
2020/07/27 Javascript
vue+element_ui上传文件,并传递额外参数操作
2020/12/05 Vue.js
[01:05:56]2018DOTA2亚洲邀请赛3月29日 小组赛A组 Newbee VS VG
2018/03/30 DOTA
进一步了解Python中的XML 工具
2015/04/13 Python
Django中实现点击图片链接强制直接下载的方法
2015/05/14 Python
Python 调用Java实例详解
2017/06/02 Python
如何利用Pyecharts可视化微信好友
2019/07/04 Python
用Python从0开始实现一个中文拼音输入法的思路详解
2019/07/20 Python
使用pytorch搭建AlexNet操作(微调预训练模型及手动搭建)
2020/01/18 Python
Spartoo芬兰:欧洲最大的网上鞋店
2016/08/28 全球购物
销售所有的狗狗产品:Dog.com
2016/10/13 全球购物
门诊挂号室室长岗位职责
2013/11/27 职场文书
会计专业的自荐信
2013/12/12 职场文书
消防器材管理制度
2014/01/28 职场文书
《李广射虎》教学反思
2014/04/27 职场文书
篮球社团活动总结
2014/06/27 职场文书
银行资信证明
2015/06/17 职场文书
总经理2015中秋节致辞
2015/07/29 职场文书
八年级作文之一起的走过日子
2019/09/17 职场文书
22句经典语录:送给优柔寡断和胡思乱想的朋友们
2019/12/13 职场文书