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 加号(+)运算符号
Dec 06 Javascript
jQuery 自动增长的文本输入框实现代码
Apr 02 Javascript
JS弹出对话框返回值代码(asp.net后台)
Dec 28 Javascript
基于jQuery的动态表格插件
Mar 28 Javascript
jquery select多选框的左右移动 具体实现代码
Jul 03 Javascript
javascript简单性能问题及学习笔记
Feb 04 Javascript
jQuery对下拉框,单选框,多选框的操作
Feb 21 Javascript
Web开发中客户端的跳转与服务器端的跳转的区别
Mar 05 Javascript
js eval函数使用,js对象和字符串互转实例
Mar 06 Javascript
在LayUI图片上传中,解决由跨域问题引起的请求接口错误的方法
Sep 24 Javascript
JQuery实现ul中添加LI和删除指定的Li元素功能完整示例
Oct 16 jQuery
微信小程序获取当前时间及星期几的实例代码
Sep 20 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
laravel 数据迁移与 Eloquent ORM的实现方法
2019/04/12 PHP
jQuery 获取URL的GET参数值的小例子
2013/04/18 Javascript
对new functionName()定义一个函数的理解
2014/05/22 Javascript
JavaScript将取代AppleScript?
2014/09/18 Javascript
Javascript writable特性介绍
2015/02/27 Javascript
微信小程序 网络API发起请求详解
2016/11/09 Javascript
js css自定义分页效果
2017/02/24 Javascript
ES6使用let命令更简单的实现块级作用域实例分析
2017/03/31 Javascript
vue中七牛插件使用的实例代码
2017/07/28 Javascript
Vue中使用方法、计算属性或观察者的方法实例详解
2018/10/31 Javascript
微信小程序map组件结合高德地图API实现wx.chooseLocation功能示例
2019/01/23 Javascript
JavaScript类型相关的常用操作总结
2019/02/14 Javascript
[56:35]DOTA2上海特级锦标赛C组小组赛#1 OG VS Archon第二局
2016/02/27 DOTA
[02:38]2018DOTA2亚洲邀请赛赛前采访-VGJ.T
2018/04/03 DOTA
Python实现的二维码生成小软件
2014/07/11 Python
在Docker上开始部署Python应用的教程
2015/04/17 Python
Python在Windows和在Linux下调用动态链接库的教程
2015/08/18 Python
让Python更加充分的使用Sqlite3
2017/12/11 Python
浅析Python 3 字符串中的 STR 和 Bytes 有什么区别
2018/10/14 Python
python 设置输出图像的像素大小方法
2019/07/04 Python
python实现批量nii文件转换为png图像
2019/07/18 Python
Python字符串大小写转换拼接删除空白
2019/09/19 Python
Python3开发环境搭建详细教程
2020/06/18 Python
python为什么会环境变量设置不成功
2020/06/23 Python
HTML5 图片悬停放大的实现代码示例
2019/12/04 HTML / CSS
大三自我鉴定范文
2013/10/05 职场文书
多媒体编辑专业毕业生推荐信
2013/11/05 职场文书
心碎乌托邦的创业计划书范文
2013/12/26 职场文书
光荣入党自我鉴定
2014/01/22 职场文书
《第一朵杏花》教学反思
2014/04/16 职场文书
奥巴马上海演讲稿
2014/09/10 职场文书
党的群众路线教育实践活动心得体会(乡镇)
2014/11/03 职场文书
2015年元宵节活动总结
2015/02/06 职场文书
2015年村级财务管理制度
2015/08/04 职场文书
2016年母亲节广告语
2016/01/28 职场文书
使用python绘制分组对比柱状图
2022/04/21 Python