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 相关文章推荐
js静态作用域的功能。
Dec 25 Javascript
JavaScript使用循环和分割来替换和删除元素实例
Oct 13 Javascript
Node.js中的process.nextTick使用实例
Jun 25 Javascript
javascript实现网页子页面遍历回调的方法(涉及 window.frames、递归函数、函数上下文)
Jul 27 Javascript
js图片轮播效果实现代码
Apr 18 Javascript
基于jQuery实现的仿百度首页滑动选项卡效果代码
Nov 16 Javascript
移动手机APP手指滑动切换图片特效附源码下载
Nov 30 Javascript
Javascript中获取浏览器类型和操作系统版本等客户端信息常用代码
Jun 28 Javascript
详解基于vue的服务端渲染框架NUXT
Jun 20 Javascript
vue.js通过路由实现经典的三栏布局实例代码
Jul 08 Javascript
layui表格数据重载
Jul 27 Javascript
通过实例了解Javascript柯里化流程
Mar 03 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自带方法验证邮箱、URL、IP是否合法的函数
2016/12/08 PHP
laravel框架模型中非静态方法也能静态调用的原理分析
2019/11/23 PHP
jQuery 常见开发使用技巧总结
2009/12/26 Javascript
基于jquery自己写tab滑动门(通用版)
2012/10/30 Javascript
关于jQuery新的事件绑定机制on()的使用技巧
2013/04/26 Javascript
使用jQuery避免鼠标双击的解决方案
2013/08/21 Javascript
jquery弹窗插件colorbox绑定动态生成元素的方法
2014/06/20 Javascript
用console.table()调试javascript
2014/09/04 Javascript
JavaScript事件类型中UI事件详解
2016/01/14 Javascript
全面解析bootstrap格子布局
2016/05/22 Javascript
JavaScript中的冒泡排序法
2016/08/03 Javascript
JavaScript实现图片轮播组件代码示例
2016/11/22 Javascript
利用nodejs监控文件变化并使用sftp上传到服务器
2017/02/18 NodeJs
Vue学习笔记进阶篇之函数化组件解析
2017/07/21 Javascript
微信小程序简单实现form表单获取输入数据功能示例
2017/11/30 Javascript
vue 组件 全局注册和局部注册的实现
2018/02/28 Javascript
实例详解vue中的$root和$parent
2019/04/29 Javascript
使用webpack/gulp构建TypeScript项目的方法示例
2019/12/18 Javascript
微信小程序如何实现精确的日期时间选择器
2020/01/21 Javascript
python 文件与目录操作
2008/12/24 Python
Python爬虫设置代理IP(图文)
2018/12/23 Python
PyTorch搭建一维线性回归模型(二)
2019/05/22 Python
Python 把序列转换为元组的函数tuple方法
2019/06/27 Python
python爬虫 2019中国好声音评论爬取过程解析
2019/08/26 Python
pytorch实现CNN卷积神经网络
2020/02/19 Python
Python3爬虫里关于代理的设置总结
2020/07/30 Python
纯CSS3实现地球自转实现代码(图文教程附送源码)
2012/12/26 HTML / CSS
英国门把手公司:Door Handle Company
2019/05/12 全球购物
商得四方公司面试题(gid+)
2014/04/30 面试题
学生喝酒检讨书
2014/02/06 职场文书
工艺员岗位职责
2014/02/11 职场文书
保密协议书范本
2014/04/22 职场文书
创业融资计划书
2014/04/25 职场文书
质检员工作总结2015
2015/04/25 职场文书
十二月早安励志心语大全
2019/12/03 职场文书
学习nginx基础知识
2021/09/04 Servers