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 相关文章推荐
Jquery下:nth-child(an+b)的使用注意
May 28 Javascript
js 去掉空格实例 Trim() LTrim() RTrim()
Jan 07 Javascript
一个不错的js html页面倒计时可精确到秒
Oct 22 Javascript
javascript实现图片自动和可控的轮播切换特效
Apr 13 Javascript
javascript顺序加载图片的方法
Jul 18 Javascript
Angular2学习笔记——详解NgModule模块
Dec 02 Javascript
VUE多层路由嵌套实现代码
May 15 Javascript
ReactNative实现图片上传功能的示例代码
Jul 11 Javascript
extjs简介_动力节点Java学院整理
Jul 17 Javascript
Vue不能检测到Object/Array更新的情况的解决
Jun 26 Javascript
php中and 和 &amp;&amp;出坑指南
Jul 13 Javascript
原生JavaScript实现五子棋游戏
Nov 09 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
全国FM电台频率大全 - 3 河北省
2020/03/11 无线电
PHP对象递归引用造成内存泄漏分析
2014/08/28 PHP
php设计模式之适配器模式实例分析【星际争霸游戏案例】
2020/04/07 PHP
关于IFRAME 自适应高度的研究
2006/07/20 Javascript
Javascript 函数对象的多重身份
2009/06/28 Javascript
基于jQuery的js分页代码
2010/06/10 Javascript
基于Jquery的表格隔行换色,移动换色,点击换色插件
2010/12/22 Javascript
Javascript中的isNaN函数使用说明
2011/11/10 Javascript
jQuery根据纬度经度查看地图处理程序
2013/05/08 Javascript
js跳转页面方法总结
2014/01/29 Javascript
无刷新预览所选择的图片示例代码
2014/04/02 Javascript
js的window.showModalDialog及window.open用法实例分析
2015/01/29 Javascript
JavaScript实现随机替换图片的方法
2015/04/16 Javascript
详解Javascript继承的实现
2016/03/25 Javascript
vue-router实现webApp切换页面动画效果代码
2017/05/25 Javascript
AngularJS+Bootstrap3多级导航菜单的实现代码
2017/08/16 Javascript
在Mac下彻底卸载node和npm的方法
2018/05/16 Javascript
JavaScript使用localStorage存储数据
2019/09/25 Javascript
python多线程编程方式分析示例详解
2013/12/06 Python
python中文件变化监控示例(watchdog)
2017/10/16 Python
django 2.2和mysql使用的常见问题
2019/07/18 Python
django3.02模板中的超链接配置实例代码
2020/02/04 Python
在python tkinter界面中添加按钮的实例
2020/03/04 Python
Python爬虫获取op.gg英雄联盟英雄对位胜率的源码
2021/01/29 Python
CSS3 background-image颜色渐变的实现代码
2018/09/13 HTML / CSS
美国大城市最热门旅游景点门票:CityPASS
2016/12/16 全球购物
保加利亚服装和鞋类购物网站:Bibloo.bg
2020/11/08 全球购物
校园安全教育广播稿
2014/02/17 职场文书
小学综合实践活动总结
2014/07/07 职场文书
代理人委托书
2014/08/01 职场文书
群众路线查摆问题整改措施思想汇报
2014/10/10 职场文书
婚礼父母致辞
2015/07/28 职场文书
如何利用JavaScript实现二叉搜索树
2021/04/02 Javascript
python析构函数用法及注意事项
2021/06/22 Python
js判断两个数组相等的5种方法
2022/05/06 Javascript
python实现双链表
2022/05/25 Python