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 相关文章推荐
JQUERY 对象与DOM对象之两者相互间的转换
Apr 27 Javascript
JS backgroundImage控制
May 19 Javascript
使用jQuery避免鼠标双击的解决方案
Aug 21 Javascript
JavaScript限定复选框的选择个数示例代码
Aug 25 Javascript
浅析jQuery中调用ajax方法时在不同浏览器中遇到的问题
Jun 11 Javascript
jQuery使用之标记元素属性用法实例
Jan 19 Javascript
JavaScript制作淘宝星级评分效果的思路
Jun 23 Javascript
JS组件系列之JS组件封装过程详解
Apr 28 Javascript
详解Node.js项目APM监控之New Relic
May 12 Javascript
Angularjs过滤器实现动态搜索与排序功能示例
Dec 13 Javascript
微信小程序 腾讯地图SDK 获取当前地址实现解析
Aug 12 Javascript
vue实现列表滚动的过渡动画
Jun 29 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
Linux环境下搭建php开发环境的操作步骤
2013/06/17 PHP
php设计模式之单例、多例设计模式的应用分析
2013/06/30 PHP
详解PHP的Yii框架中自带的前端资源包的使用
2016/03/31 PHP
基于php实现的验证码小程序
2016/12/13 PHP
Yii框架分页实现方法详解
2017/05/20 PHP
解决出现SoapFault (looks like we got no XML document)的问题
2017/06/24 PHP
php封装单文件上传到数据库(路径)
2017/10/15 PHP
PHP设计模式之适配器模式定义与用法详解
2018/04/03 PHP
LazyForm jQuery plugin 定制您的CheckBox Radio和Select
2009/10/24 Javascript
修改好的jquery滚动字幕效果实现代码
2011/06/22 Javascript
Egret引擎开发指南之编译项目
2014/09/03 Javascript
javascript实现类似于新浪微博搜索框弹出效果的方法
2015/07/27 Javascript
Bootstrap模态框水平垂直居中与增加拖拽功能
2016/11/09 Javascript
JavaScript中this的用法及this在不同应用场景的作用解析
2017/04/13 Javascript
简单实现jQuery弹幕效果
2017/05/06 jQuery
Windows下快速搭建NodeJS本地服务器的步骤
2017/08/09 NodeJs
js禁止浏览器页面后退功能的实例(推荐)
2017/09/01 Javascript
微信小程序激励式视频广告组件使用详解
2019/12/06 Javascript
ES6 Symbol在对象中的作用实例分析
2020/06/06 Javascript
[45:52]完美世界DOTA2联赛PWL S3 Forest vs INK ICE 第二场 12.09
2020/12/12 DOTA
用Python编写一个简单的俄罗斯方块游戏的教程
2015/04/03 Python
通过Python使用saltstack生成服务器资产清单
2016/03/01 Python
Python中对象迭代与反迭代的技巧总结
2016/09/17 Python
shelve  用来持久化任意的Python对象实例代码
2016/10/12 Python
python正则表达式re之compile函数解析
2017/10/25 Python
Python连接Redis的基本配置方法
2018/09/13 Python
python全栈要学什么 python全栈学习路线
2019/06/28 Python
解决TensorFlow训练内存不断增长,进程被杀死问题
2020/02/05 Python
jupyter notebook的安装与使用详解
2020/05/18 Python
Canvas绘制浮动球效果的示例
2017/12/29 HTML / CSS
HTML5实现移动端复制功能
2018/04/19 HTML / CSS
欧缇丽英国官方网站:Caudalie英国
2016/08/17 全球购物
财务会计人员岗位职责
2013/11/30 职场文书
优秀导游先进事迹材料
2014/01/25 职场文书
动画设计系毕业生求职信
2014/07/15 职场文书
mysql数据库如何转移到oracle
2022/12/24 MySQL