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

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就可以在任意模块引入然后使用,减少代码的使用,方便维护

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,670评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,928评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,926评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,238评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,112评论 4 356
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,138评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,545评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,232评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,496评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,596评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,369评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,226评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,600评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,906评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,185评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,516评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,721评论 2 335

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,497评论 18 139
  • 我现在都不好意思跟别人讲说,我的爱好是写作。因为种种琐事,辍笔有一阵子了。其实,导致我辍笔的原因仅仅是因为那些鸡毛...
    梨子酱欧尼阅读 180评论 0 1
  • -1-伤别 “我现在身后就是白鹭岛石化厂,今日凌晨5点左右工厂内二号石化基地突然发生爆炸,导致三个石脑油储罐爆裂燃...
    逸行客阅读 387评论 8 2
  • 小舟是一个企业的办公室职员,恬静,爱学习,闲暇时总喜欢看书。 也许因为她办公室宽敞方便,人缘也好,所以下班后几个要...
    一剪红梅阅读 510评论 4 12