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和注册表脚本实现右键收藏Web页选中文本
Jan 28 Javascript
使用prototype.js 的时候应该特别注意的几个问题.
Apr 12 Javascript
js Flash插入函数免激活代码
Mar 31 Javascript
js实现按Ctrl+Enter发送效果
Sep 18 Javascript
jQuery扇形定时器插件pietimer使用方法详解
Jul 18 jQuery
使用ionic(选项卡栏tab) icon(图标) ionic上拉菜单(ActionSheet) 实现通讯录界面切换实例代码
Oct 20 Javascript
原生JS实现瀑布流插件
Feb 06 Javascript
使用Angular CLI进行Build(构建)和Serve详解
Mar 24 Javascript
vue组件(全局,局部,动态加载组件)
Sep 02 Javascript
用原生JS实现爱奇艺首页导航栏代码实例
Sep 19 Javascript
微信小程序开发(一):服务器获取数据列表渲染操作示例
Jun 01 Javascript
快速解决vue2+vue-cli3项目ie兼容的问题
Nov 17 Vue.js
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
基于mysql的论坛(3)
2006/10/09 PHP
phpinfo 系统查看参数函数代码
2009/06/05 PHP
php 注册时输入信息验证器的实现详解
2013/07/05 PHP
PHP实现简单的计算器
2020/08/28 PHP
javascript自执行函数之伪命名空间封装法
2010/12/25 Javascript
jQuery 插件仿百度搜索框智能提示(带Value值)
2013/01/22 Javascript
JS 删除字符串最后一个字符的实现代码
2014/02/20 Javascript
js设置文本框中焦点位置在最后的示例代码(简单实用)
2014/03/04 Javascript
jquery做的一个简单的屏幕锁定提示框
2014/03/26 Javascript
jQuery的3种请求方式$.post,$.get,$.getJSON
2014/03/28 Javascript
Javascript 计算字符串在localStorage中所占字节数
2015/10/21 Javascript
一起学写js Calender日历控件
2016/04/14 Javascript
JavaScript获取URL中参数querystring的方法详解
2016/10/11 Javascript
详解MVC如何使用开源分页插件(shenniu.pager.js)
2016/12/16 Javascript
详解Angular2 关于*ngFor 嵌套循环
2017/05/22 Javascript
AngularJS中的路由使用及实现代码
2017/10/09 Javascript
浅谈Vue2.0中v-for迭代语法的变化(key、index)
2018/03/06 Javascript
3分钟读懂移动端rem使用方法(推荐)
2019/05/06 Javascript
node.js事件轮询机制原理知识点
2019/12/22 Javascript
JavaScript实现矩形块大小任意缩放
2020/08/25 Javascript
ES6中的Javascript解构的实现
2020/10/30 Javascript
python输出指定月份日历的方法
2015/04/23 Python
DataFrame 将某列数据转为数组的方法
2018/04/13 Python
Python运维自动化之nginx配置文件对比操作示例
2018/08/29 Python
Python wxPython库使用wx.ListBox创建列表框示例
2018/09/03 Python
keras 读取多标签图像数据方式
2020/06/12 Python
CSS3绘制不规则图形的一些方法示例
2015/11/07 HTML / CSS
美国电子产品主要品牌的授权在线零售商:DataVision
2019/03/23 全球购物
linux下进程间通信的方式
2014/12/23 面试题
大学班级学风建设方案
2014/05/01 职场文书
应届生自荐书
2014/06/23 职场文书
地方白酒代理协议书
2014/10/25 职场文书
师德承诺书2015
2015/04/28 职场文书
最新农村养殖致富:资金投入较低的创业项目有哪些?
2019/09/26 职场文书
javaScript Array api梳理
2021/03/31 Javascript
python的列表生成式,生成器和generator对象你了解吗
2022/03/16 Python