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 indexOf函数使用说明
Jul 03 Javascript
Windows8下搭建Node.js开发环境教程
Sep 03 Javascript
使用命令对象代替switch语句的写法示例
Feb 28 Javascript
js仿QQ中对联系人向左滑动、滑出删除按钮的操作
Apr 07 Javascript
学习Node.js模块机制
Oct 17 Javascript
详解jQuery事件
Jan 13 Javascript
详解如何在Vue2中实现组件props双向绑定
Mar 29 Javascript
Node.js如何实现注册邮箱激活功能 (常见)
Jul 23 Javascript
微信小程序多音频播放进度条问题
Aug 28 Javascript
react中使用css的7中方式(最全总结)
Feb 11 Javascript
Vuex的热更替如何实现
Jun 05 Javascript
JS时间戳与日期格式互相转换的简单方法示例
Jan 30 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
DC漫画《蝙蝠侠和猫女》图透 猫女怀孕老爷当爹
2020/04/09 欧美动漫
PHP中鲜为人知的10个函数
2014/02/28 PHP
CI框架在CLI下执行占用内存过大问题的解决方法
2014/06/17 PHP
Laravel框架生命周期与原理分析
2018/06/12 PHP
Ajax+PHP实现的模拟进度条功能示例
2019/02/11 PHP
Z-Blog中用到的js代码
2007/03/15 Javascript
InnerHtml和InnerText的区别分析
2009/03/13 Javascript
window.event快达到全浏览器支持了,以后使用就方便了
2011/11/30 Javascript
jquery内置验证(validate)使用方法示例(表单验证)
2013/12/04 Javascript
浅谈javascript中的instanceof和typeof
2015/02/27 Javascript
jquery获取url参数及url加参数的方法
2015/10/26 Javascript
原生js实现移动端瀑布流式代码示例
2015/12/18 Javascript
前端js弹出框组件使用方法
2020/08/24 Javascript
详解js正则表达式验证时间格式xxxx-xx-xx形式
2018/02/09 Javascript
说说node中的可读流和可写流的区别
2018/06/01 Javascript
React 路由懒加载的几种实现方案
2018/10/23 Javascript
Node.js折腾记一:读指定文件夹,输出该文件夹的文件树详解
2019/04/20 Javascript
使用 vue 实例更好的监听事件及vue实例的方法
2019/04/22 Javascript
javascript实现导航栏分页效果
2019/06/27 Javascript
浅析JS中NEW的实现原理及重写
2020/02/20 Javascript
vue项目接口管理,所有接口都在apis文件夹中统一管理操作
2020/08/13 Javascript
JavaScript 防盗链的原理以及破解方法
2020/12/29 Javascript
Python内置数据类型详解
2014/08/18 Python
Python中time模块与datetime模块在使用中的不同之处
2015/11/24 Python
python 爬取微信文章
2016/01/30 Python
Python 迭代器工具包【推荐】
2016/05/06 Python
python读写json文件的简单实现
2017/04/11 Python
Python 自动化表单提交实例代码
2017/06/08 Python
用TensorFlow实现lasso回归和岭回归算法的示例
2018/05/02 Python
python实现数据分析与建模
2019/07/11 Python
django项目中新增app的2种实现方法
2020/04/01 Python
linux下进程间通信的方式
2014/12/23 面试题
商务英语专业毕业生自荐信
2013/11/05 职场文书
中学生打架检讨书
2014/02/10 职场文书
二年级学生评语大全
2014/04/23 职场文书
2014年加油站工作总结
2014/12/04 职场文书