angular基于ng-alain定义自己的select组件示例


Posted in Javascript onFebruary 23, 2018

1、首先是my-select2.component.html页面,这里是在ng-alain的select基础上根据业务需求添加新的功能;代码如下:

<nz-select #select style="width:100%;" [(ngModel)]="selectedOption" [nzPlaceHolder]="myPlaceHolder" nzAllowClear [nzShowSearch]="true" [nzNotFoundContent]="'无匹配'">
  <nz-option
    *ngFor="let option of options"
    [nzLabel]="option.label"
    [nzValue]="option"
    [nzDisabled]="option.disabled">
  </nz-option>
</nz-select>

2、再者是my-select2.component.ts页面,代码里面有注释;代码如下:

import { ControlValueAccessor } from '@angular/forms/src/directives';
import { Component, forwardRef, Input,OnInit,ElementRef,Output,EventEmitter} from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import { Router, NavigationEnd } from '@angular/router';
import { FormGroup, FormBuilder, Validators } from '@angular/forms';
import { SelectService } from './my-select2.service';
declare var $: any;
@Component({
 selector: 'nz-select2',
 templateUrl: './my-select2.component.html',
 providers: [ 
     {
      provide: NG_VALUE_ACCESSOR,
      useExisting: forwardRef(() => NzSelect2Component),//注入表单控件
      multi: true
     }]
})
export class NzSelect2Component implements OnInit{
  constructor(private selectService:SelectService) { 
  }
 innerValue: any = ''; 
 //监听绑定的值,与外岑的ngModel相互绑定
 set selectedOption(val:any){
   if (val !== this.innerValue) {
      this.innerValue = val;
      this.onChangeCallback(val.value);
      this.dataBack.emit(val.value); // 事件
    }
 }
 get selectedOption():any{
    return this.innerValue;
 }
 options = [];//接收select的数组
  _dataSource:any;//接收本地的自定义数组或者请求返回的数组
 @Input()
 url:any;//请求的url
 @Input()
 myPlaceHolder:any;//自定义的PlaceHolder
 @Input()
 //下拉框的数据格式
  fieldKey:any = {
    text: 'text',
     value: 'value'
  };
 @Input()
  set dataSource(val: any) {
    this._dataSource = val;
    if ($.isArray(this._dataSource)) {   
    this.options=this._dataTransform(this._dataSource);//如果是本地数组或直接请求的数组直接复制
    }
  }
  get dataSource(): any {
    return this._dataSource;
  }
 @Output() dataBack = new EventEmitter<any>();
 registerOnChange(fn: (value: any) => void) { 
   this.onChangeCallback = fn;
 }
 registerOnTouched(fn: any) {
   this.onTouchedCallback = fn;
 }
  writeValue(value: string) {

  }
 onChangeCallback = (value: any) => {};
 onTouchedCallback = (value: any) => {};
 ngOnInit() {
     //如果url存在则直接请求
    if(this.url){
      this.selectService.getValue(this.url).subscribe(data => { 
        data = data.rows || data.data;    
        this.options=this._dataTransform(data);
      });
    }   
 }
 //转换下拉框下的字段
  _dataTransform(data: Array<any>){
    let _data = [];
    for (let i = 0; i < data.length; i++) {
     _data[i] = {};
     _data[i].label = data[i][this.fieldKey.text];
     _data[i].value = data[i][this.fieldKey.value];
    }
    return _data;
 }
}

3、然后是my-select2.service.ts页面,这里主要是请求后台接口返回的下拉数组,url为父组件传过来的链接,代码如下:

import { Injectable } from '@angular/core';
import { Headers, Http, URLSearchParams,RequestOptions } from '@angular/http';
import { HttpClient, HttpErrorResponse } from '@angular/common/http';
import 'rxjs/add/operator/toPromise';
// import { environment } from '../../environments/environment';
@Injectable()
export class SelectService {
  constructor(private http: HttpClient) {}
  getValue(url: any):any{
    return this.http
      .get(url);
   
  }
}

4、然后是myselect.module.ts页面,这里,使用该组件的前提是要引入 import { NzSelectModule } from 'ng-zorro-antd',代码如下:

import { NgModule, ModuleWithProviders }    from '@angular/core';
import { CommonModule }  from '@angular/common';
import { FormsModule,ReactiveFormsModule } from '@angular/forms';
import { NzSelect2Component } from './my-select2.component';
import { SelectService } from './my-select2.service';
import { NzSelectModule } from 'ng-zorro-antd';
@NgModule({
  imports: [
    CommonModule,
    FormsModule,
    NzSelectModule,
    ReactiveFormsModule
  ],
  exports:[
    NzSelect2Component
  ],
  declarations: [
    NzSelect2Component
  ],
  providers: [
     SelectService
  ]
}) 

export class MySelectModule {
  constructor() {

  }
}

5、使用方法,在你需要的模块引入:MySelectModule

import { MySelectModule } from 'bizapp/base/components/myselect/myselect.module';

6、如何调用:url为请求后台的接口,fieldKey为数组的格式,这里可以根据后台返回来的格式定义这里的字段,如:后台返回格式为[{dmsm1:5,dmz:5}]则fieldKey的定义如下,myPlaceHolder为初始化时显示的内容,如果是本地数组,则只需要加上[dataSource]="peer",这里的peer为本地数组

<nz-select2  [url]="'analysis/api/data/code/list/030107'" [(ngModel)]="search2.hpzl" [fieldKey]="{text:'dmsm1',value:'dmz'}" [myPlaceHolder]="'号牌种类'"></nz-select2>

7、总结:通过这个组件,我们只需要修改url和fieldKey就可以在任意模块引入然后使用,减少代码的使用,方便维护

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

Javascript 相关文章推荐
javascript学习笔记(二十) 获得和设置元素的特性(属性)
Jun 20 Javascript
原生javascript兼容性测试实例
Jul 01 Javascript
js格式化时间小结
Nov 03 Javascript
JavaScript转换二进制编码为ASCII码的方法
Apr 16 Javascript
一个简单的JavaScript Map实例(分享)
Aug 03 Javascript
Vue2递归组件实现树形菜单
Apr 10 Javascript
jQuery插件FusionCharts绘制2D柱状图和折线图的组合图效果示例【附demo源码】
Apr 10 jQuery
ReactNative短信验证码倒计时控件的实现代码
Jul 20 Javascript
详解Javascript中new()到底做了些什么?
Mar 29 Javascript
vue两组件间值传递 $router.push实现方法
May 15 Javascript
JavaScript链式调用原理与实现方法详解
May 16 Javascript
Ant Design Vue table中列超长显示...并加提示语的实例
Oct 31 Javascript
搭建element-ui的Vue前端工程操作实例
Feb 23 #Javascript
使用Vue.js和Element-UI做一个简单登录页面的实例
Feb 23 #Javascript
Vue2 模板template的四种写法总结
Feb 23 #Javascript
Vue 创建组件的两种方法小结(必看)
Feb 23 #Javascript
Vue-cli Eslint在vscode里代码自动格式化的方法
Feb 23 #Javascript
ES6下子组件调用父组件的方法(推荐)
Feb 23 #Javascript
angular动态表单制作
Feb 23 #Javascript
You might like
php截取字符串函数分享
2015/02/02 PHP
php查看当前Session的ID实例
2015/03/16 PHP
Laravel5权限管理方法详解
2016/07/26 PHP
Linux系统中为php添加pcntl扩展
2016/08/28 PHP
基于jQuery图片平滑连续滚动插件
2009/04/27 Javascript
一个非常全面的javascript URL解析函数和分段URL解析方法
2014/04/12 Javascript
js实现select下拉框菜单
2015/12/08 Javascript
ajax请求+vue.js渲染+页面加载的示例
2018/02/11 Javascript
js使用ajax传值给后台,后台返回字符串处理方法
2018/08/08 Javascript
js实现左右轮播图
2020/01/09 Javascript
国内常用的js类库大全(CDN公共库)
2020/06/24 Javascript
[51:07]VGJ.S vs Pain 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
Python中列表、字典、元组、集合数据结构整理
2014/11/20 Python
正确理解python中的关键字“with”与上下文管理器
2017/04/21 Python
python实现发送邮件及附件功能
2021/03/02 Python
使用pytorch实现可视化中间层的结果
2019/12/30 Python
Python动态声明变量赋值代码实例
2019/12/30 Python
linux环境下安装python虚拟环境及注意事项
2020/01/07 Python
Pytorch数据拼接与拆分操作实现图解
2020/04/30 Python
解决python 执行shell命令无法获取返回值的问题
2020/12/05 Python
使用css3匹配手机屏幕横竖状态
2014/01/27 HTML / CSS
从一次项目重构说起CSS3自定义变量在项目的使用方法
2021/03/01 HTML / CSS
HTML5的结构和语义(1):前言
2008/10/17 HTML / CSS
HTML5 video 事件应用示例
2014/09/11 HTML / CSS
在线购买世界上最好的酒:BoozeBud
2018/06/07 全球购物
先进事迹报告会感言
2014/01/24 职场文书
小学语文国培感言
2014/03/04 职场文书
个人借款担保书
2014/04/02 职场文书
2014年教师政治学习材料
2014/06/02 职场文书
小学校园文化建设汇报材料
2014/08/19 职场文书
高中生学习计划书
2014/09/15 职场文书
考试作弊被抓检讨书
2014/10/02 职场文书
房屋租赁合同补充协议
2014/10/11 职场文书
武当山导游词
2015/02/03 职场文书
2015年主婚人婚礼致辞
2015/07/28 职场文书
python数字图像处理之图像的批量处理
2022/06/28 Python