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 相关文章推荐
jquery的相对父元素和相对文档定位示例代码
Aug 02 Javascript
javascript版2048小游戏
Mar 18 Javascript
JS实现动态修改table及合并单元格的方法示例
Feb 20 Javascript
js清除浏览器缓存的几种方法
Mar 15 Javascript
JavaScript中Object值合并方法详解
Dec 22 Javascript
ionic+html5+API实现双击返回键退出应用
Sep 17 Javascript
使用原生JS实现火锅点餐小程序(面向对象思想)
Dec 10 Javascript
判断JavaScript中的两个变量是否相等的操作符
Dec 21 Javascript
js键盘事件实现人物的行走
Jan 17 Javascript
JS如何在数组指定位置插入元素
Mar 10 Javascript
js实现点击按钮随机生成背景颜色
Sep 05 Javascript
element-ui点击查看大图的方法示例
Dec 14 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
php mysql 判断update之后是否更新了的方法
2012/01/10 PHP
php制作简单模版引擎
2016/04/07 PHP
提高Laravel应用性能方法详解
2019/06/24 PHP
PHP框架实现WebSocket在线聊天通讯系统
2019/11/21 PHP
理解Javascript_13_执行模型详解
2010/10/20 Javascript
jcarousellite.js 基于Jquery的图片无缝滚动插件
2010/12/30 Javascript
javascript获取dom的下一个节点方法
2014/09/05 Javascript
用C/C++来实现 Node.js 的模块(一)
2014/09/24 Javascript
jQuery事件绑定和委托实例
2014/11/25 Javascript
jQuery组件easyui基本布局实现代码
2016/08/25 Javascript
使用jQuery.Qrcode插件在客户端动态生成二维码并添加自定义Logo
2016/09/01 Javascript
支持移动端原生js轮播图
2017/02/16 Javascript
Node.js编写CLI的实例详解
2017/05/17 Javascript
vue组件学习教程
2017/09/09 Javascript
AngularJS实现表单验证功能详解
2017/10/12 Javascript
浅谈Node模块系统及其模式
2017/11/17 Javascript
python提取页面内url列表的方法
2015/05/25 Python
网站渗透常用Python小脚本查询同ip网站
2017/05/08 Python
浅析PHP与Python进行数据交互
2018/05/15 Python
完美解决Python 2.7不能正常使用pip install的问题
2018/06/12 Python
使用Windows批处理和WMI设置Python的环境变量方法
2019/08/14 Python
Python namedtuple命名元组实现过程解析
2020/01/08 Python
Python PIL库图片灰化处理
2020/04/07 Python
一篇文章教你用python画动态爱心表白
2020/11/22 Python
用CSS3打造HTML5的Logo(实现代码)
2016/06/16 HTML / CSS
世界上最好的儿童品牌:AlexandAlexa
2018/01/27 全球购物
Michael Kors加拿大官网:购买设计师手袋、手表、鞋子、服装等
2019/03/16 全球购物
班长岗位职责
2013/11/10 职场文书
幼儿园门卫制度
2014/01/29 职场文书
军训自我鉴定范文
2014/02/13 职场文书
2014全国两会心得体会
2014/03/17 职场文书
大学生实习鉴定评语
2014/04/25 职场文书
MySQL 角色(role)功能介绍
2021/04/24 MySQL
mysql分组后合并显示一个字段的多条数据方式
2022/01/22 MySQL
用Python实现屏幕截图详解
2022/01/22 Python
ubuntu端向日葵键盘输入卡顿问题及解决
2022/12/24 Servers