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 相关文章推荐
类似CSDN图片切换效果脚本
Sep 17 Javascript
jQuery学习笔记之创建DOM元素
Jan 19 Javascript
js读取并解析JSON类型数据的方法
Nov 14 Javascript
创建基于Bootstrap的下拉菜单的DropDownList的JQuery插件
Jun 02 Javascript
AngularJS的脏检查深入分析
Apr 22 Javascript
js中less常用的方法小结
Aug 09 Javascript
vue 实现通过手机发送短信验证码注册功能
Apr 19 Javascript
Webpack的dll功能使用
Jun 28 Javascript
mpvue 如何使用腾讯视频插件的方法
Jul 16 Javascript
layui前端框架之table表数据的刷新方法
Aug 17 Javascript
解决eclipse中没有js代码提示的问题
Oct 10 Javascript
Vue 中使用lodash对事件进行防抖和节流操作
Jul 26 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中看实例学正则表达式
2006/12/25 PHP
php5 mysql分页实例代码
2008/04/10 PHP
php 去除html标记--strip_tags与htmlspecialchars的区别详解
2013/06/26 PHP
php 遍历目录,生成目录下每个文件的md5值并写入到结果文件中
2016/12/12 PHP
老生常谈PHP面向对象之解释器模式
2017/05/17 PHP
php创建多级目录与级联删除文件的方法示例
2019/09/12 PHP
WordPress JQuery处理沙发头像
2009/06/22 Javascript
JavaScript 学习笔记(十四) 正则表达式
2010/01/22 Javascript
jquery乱码与contentType属性设置问题解决方案
2013/01/07 Javascript
jQuery提交多个表单的小例子
2013/06/30 Javascript
深入理解jQuery事件绑定
2016/06/02 Javascript
详解nodejs中exports和module.exports的区别
2017/02/17 NodeJs
利用JS实现简单的瀑布流加载图片效果
2017/04/22 Javascript
JS中async/await实现异步调用的方法
2019/08/28 Javascript
vue el-upload上传文件的示例代码
2020/12/21 Vue.js
[55:45]LGD vs OG 2019国际邀请赛淘汰赛 胜者组 BO3 第三场 8.24
2019/09/10 DOTA
Python Deque 模块使用详解
2014/07/04 Python
Python手机号码归属地查询代码
2016/05/04 Python
python中print的不换行即时输出的快速解决方法
2016/07/20 Python
Python中如何优雅的合并两个字典(dict)方法示例
2017/08/09 Python
Python2.7下安装Scrapy框架步骤教程
2017/12/22 Python
对sklearn的使用之数据集的拆分与训练详解(python3.6)
2018/12/14 Python
PyQT实现菜单中的复制,全选和清空的功能的方法
2019/06/17 Python
用CSS3的box-reflect来制作倒影效果
2016/11/15 HTML / CSS
HTML5逐步分析实现拖放功能的方法
2020/09/30 HTML / CSS
美国环保婴儿用品公司:The Honest Company
2017/11/23 全球购物
Famous Footwear加拿大:美国多品牌运动休闲鞋店
2018/12/05 全球购物
中软国际Java程序员笔试题
2014/07/19 面试题
小学生自我鉴定
2013/10/12 职场文书
大学生入党思想汇报
2014/01/14 职场文书
物业总经理助理岗位职责
2014/06/29 职场文书
个人融资协议书
2014/10/02 职场文书
综合素质评价思想道德自我评价
2015/03/09 职场文书
党员承诺书范文2015
2015/04/27 职场文书
浅谈哪个Python库才最适合做数据可视化
2021/06/28 Python
Tomcat执行startup.bat出现闪退的原因及解决办法
2022/04/20 Servers