Angular6 写一个简单的Select组件示例


Posted in Javascript onAugust 20, 2018

Select组件目录结构

/src
  /app
    /select
    /select.ts
    /select.html
    /select.css
    /options.ts
    /index.ts
//select.ts
import { Component, ContentChildren, ViewChild, Input, Output, EventEmitter, QueryList, HostListener } from '@angular/core';
import { NzOptionDirective } from './option';
@Component({
 selector: 'nz-select',
 templateUrl: './select.html',
 styleUrls: ['./select.css']
})
export class NzSelectComponent {
 @Input() isOpen: boolean;
 @Input() value: string;
 @Output() valueChange = new EventEmitter<any>();
 label: string;
 @ContentChildren(NzOptionDirective, { descendants: true }) options: QueryList<NzOptionDirective>;

 ngAfterContentInit() {
  this.options.forEach(option => {
   option.select.subscribe(() => {
    this.value = option.value;
    this.label = option.renderLabel();
    this.options.map(r => r.isSelected = false);
    option.isSelected = true;
    this.valueChange.emit(option.value);
   })
   setTimeout(() => {
    option.isSelected = option.value === this.value;
    if (option.isSelected) {
     this.label = option.renderLabel();
     this.valueChange.emit(option.value);
    }
   });
  })
 }

 @HostListener('click')
 onClick() {
  this.isOpen = !this.isOpen;
 }
}
//select.html
<ng-content *ngIf="isOpen"></ng-content>
<div *ngIf="!isOpen">{{label}}</div>
//select.css
:host {
 display: inline-block;
 border: 1px solid;
 cursor: pointer;
 text-align: center;
 border-radius: 4px;
}

:host .current{
 padding:5px 10px;
 background:red;
 color:#FFF;
 text-align: center;
 width:40px;
 outline: none;
 border: none;
}

::ng-deep div:not(.current):hover{
 background:green;
 color:#FFF;
}

::ng-deep .selected {
 font-weight: 700;
 background: red;
 color:#FFF;
}
//options.ts
import { Directive,HostBinding,HostListener,Input,Output,ElementRef,EventEmitter} from '@angular/core';

@Directive({
 selector:'[nzOption]'
})
export class NzOptionDirective{
 @Input() value:string;
 constructor(private el:ElementRef){}
 @Output() select = new EventEmitter<any>();
 
 @HostBinding("class.selected")
 isSelected: boolean;

 renderLabel(){
  return (this.el.nativeElement.textContent || "").trim();
 }

 @HostListener('click')
 onClick(){
  this.select.emit();
 }

}
//index.ts
import { NzOptionDirective } from './option';
import { NzSelectComponent } from './select';
export const components = [
 NzSelectComponent,
 NzOptionDirective
];

应用 Select 组件

结构

/src
  /app/
    /app.module.ts
    /app.component.ts
    /app.component.html
//app.module.ts
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { FormsModule } from '@angular/forms';
import { CommonModule } from '@angular/common';
import {components} from './select';
import { AppComponent } from './app.component';
@NgModule({
 imports:   [ BrowserModule, FormsModule,CommonModule ],
 declarations: [ AppComponent,...components],
 bootstrap:  [ AppComponent ]
})
export class AppModule { }
//app.component.ts
import { Component } from '@angular/core';

@Component({
 selector: 'my-app',
 templateUrl: './app.component.html',
 styleUrls: ['./app.component.css']
})
export class AppComponent {
 name = 'Angular';

 defaultValue: any = 'value5'

 menus: any[] = [];

 ngOnInit() {
  for (let i = 0; i <= 6; i++) {
   this.menus.push({
    value: 'value' + i,
    label: 'item' + i
   })
  }
 }
}
//app.component.html
<nz-select [(value)]="defaultValue" [isOpen]="false">
 <div nzOption *ngFor="let m of menus" [value]="m.value">{{m.label}}</div>
</nz-select>
<pre>
 select value is <b>{{defaultValue|json}}</b>
</pre>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript 更严格的相等 [译]
Sep 20 Javascript
jquery.validate的使用说明介绍
Nov 12 Javascript
javascript新建标签,判断键盘输入,以及判断焦点(示例代码)
Nov 25 Javascript
深入理解javascript构造函数和原型对象
Sep 23 Javascript
js限制文本框只能输入整数或者带小数点的数字
Apr 27 Javascript
基于angular2 的 http服务封装的实例代码
Jun 29 Javascript
vue引入新版 vue-awesome-swiper插件填坑问题
Jan 25 Javascript
React为 Vue 引入容器组件和展示组件的教程详解
May 03 Javascript
element-ui表格列金额显示两位小数的方法
Aug 24 Javascript
webpack4 处理SCSS的方法示例
Sep 03 Javascript
详解Node.js 中使用 ECDSA 签名遇到的坑
Nov 26 Javascript
JavaScript获取某一天所在的星期
Sep 05 Javascript
Layer弹出层动态获取数据的方法
Aug 20 #Javascript
layui 给数据表格加序号的方法
Aug 20 #Javascript
解决LayUI表单获取不到data的问题
Aug 20 #Javascript
Layui数据表格之获取表格中所有的数据方法
Aug 20 #Javascript
解决layui上传文件提示上传异常,实际文件已经上传成功的问题
Aug 19 #Javascript
解决layui中table异步数据请求不支持自定义返回数据格式的问题
Aug 19 #Javascript
Vue常用指令详解分析
Aug 19 #Javascript
You might like
不用数据库的多用户文件自由上传投票系统(3)
2006/10/09 PHP
使用PHP的日期与时间函数技巧
2008/04/24 PHP
20个PHP常用类库小结
2011/09/11 PHP
自编函数解决pathinfo()函数处理中文问题
2014/11/03 PHP
PHP date函数常用时间处理方法
2015/05/11 PHP
PHP版本升级到7.x后wordpress的一些修改及wordpress技巧
2015/12/25 PHP
Yii2使用$this-&gt;context获取当前的Module、Controller(控制器)、Action等
2017/03/29 PHP
php日志函数error_log用法实例分析
2019/09/23 PHP
javascript 建设银行登陆键盘
2008/06/10 Javascript
js 浏览本地文件夹系统示例代码
2013/10/24 Javascript
JavaScript位移运算符(无符号) &gt;&gt;&gt; 三个大于号 的使用方法详解
2016/03/31 Javascript
javascript汉字拼音互转的简单实例
2016/10/09 Javascript
JS判断指定dom元素是否在屏幕内的方法实例
2017/01/23 Javascript
原生js开发的日历插件
2017/02/04 Javascript
JS实现复制内容到剪贴板功能
2017/02/05 Javascript
使用命令行工具npm新创建一个vue项目的方法
2017/12/27 Javascript
对angularJs中自定义指令replace的属性详解
2018/10/09 Javascript
layui实现数据分页功能(ajax异步)
2019/07/27 Javascript
原生JS运动实现轮播图
2021/01/02 Javascript
python发送邮件实例分享
2017/07/28 Python
python遍历文件夹下所有excel文件
2018/01/03 Python
python基于http下载视频或音频
2018/06/20 Python
详解Python 爬取13个旅游城市,告诉你五一大家最爱去哪玩?
2019/05/07 Python
python超时重新请求解决方案
2019/10/21 Python
python框架django项目部署相关知识详解
2019/11/04 Python
韩国三星旗下的一家超市连锁店:Home Plus
2016/07/30 全球购物
你在项目中用到了xml技术的哪些方面?如何实现的?
2014/01/26 面试题
初一新生军训方案
2014/05/22 职场文书
参赛口号
2014/06/16 职场文书
单位在职证明书
2014/09/11 职场文书
领导干部“四风”查摆问题个人整改措施
2014/10/28 职场文书
员工自我工作评价
2015/03/06 职场文书
会计试用期自我评价
2015/03/10 职场文书
PostgreSQL存储过程实用脚本(二):创建函数入门
2021/04/05 PostgreSQL
django学习之ajax post传参的2种格式实例
2021/05/14 Python
python画条形图的具体代码
2022/04/20 Python