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 播放器 控制
Jan 22 Javascript
汉化英文版的Dreamweaver CS5并自动提示jquery
Nov 25 Javascript
jQuery弹出层始终垂直居中相对于屏幕或当前窗口
Apr 01 Javascript
jquery中append()与appendto()用法分析
Nov 14 Javascript
jQuery实现简单下拉导航效果
Sep 07 Javascript
基于JavaScript短信验证码如何实现
Jan 24 Javascript
JavaScript定义数组的三种方法(new Array(),new Array('x','y')
Oct 04 Javascript
easyui-edatagrid.js实现回车键结束编辑功能的实例
Apr 12 Javascript
JavaScript之浏览器对象_动力节点Java学院整理
Jul 03 Javascript
vue页面加载闪烁问题的解决方法
Mar 28 Javascript
JavaScript中concat复制数组方法浅析
Jan 20 Javascript
简单了解Javscript中兄弟ifream的方法调用
Jun 17 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
一个用于MySQL的PHP XML类
2006/10/09 PHP
php中用foreach来操作数组的代码
2011/07/17 PHP
PHP exif扩展方法开启详解
2014/07/28 PHP
如何写php守护进程(Daemon)
2015/12/30 PHP
PHP获取当前文件的父目录方法汇总
2016/07/21 PHP
示例详解Laravel重置密码代码重构
2016/08/10 PHP
PHP开发API接口签名生成及验证操作示例
2020/05/27 PHP
JavaScript 使用技巧精萃(.net html
2009/04/25 Javascript
extjs 初始化checkboxgroup值的代码
2011/09/21 Javascript
Javascript 浮点运算的问题分析与解决方法
2013/08/27 Javascript
3个可以改善用户体验的AngularJS指令介绍
2015/06/18 Javascript
JavaScript仿静态分页实现方法
2015/08/04 Javascript
BootStrap 附加导航组件
2016/07/22 Javascript
JS识别浏览器类型(电脑浏览器和手机浏览器)
2016/11/18 Javascript
Flask中获取小程序Request数据的两种方法
2017/05/12 Javascript
bootstrap table实现x-editable的行单元格编辑及解决数据Empty和支持多样式问题
2017/08/10 Javascript
angularjs 缓存的使用详解
2018/03/19 Javascript
Vee-validate 父组件获取子组件表单校验结果的实例代码
2019/05/20 Javascript
微信小程序模板消息推送的两种实现方式
2019/08/27 Javascript
js实现九宫格布局效果
2020/05/28 Javascript
vue 组件之间事件触发($emit)与event Bus($on)的用法说明
2020/07/28 Javascript
[57:37]EG vs Mineski 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
Python标准库defaultdict模块使用示例
2015/04/28 Python
Python中一般处理中文的几种方法
2019/03/06 Python
Flask-SocketIO服务端安装及使用代码示例
2020/11/26 Python
python 实现一个简单的线性回归案例
2020/12/17 Python
Python 带星号(* 或 **)的函数参数详解
2021/02/23 Python
JustFab加拿大:女鞋、靴子、手袋和服装在线
2018/05/18 全球购物
Timberland俄罗斯官方网上商店:全球领先的户外品牌
2020/03/15 全球购物
企业演讲稿范文
2013/12/28 职场文书
《走一步再走一步》教学反思
2014/02/15 职场文书
基层党员对照检查材料
2014/09/24 职场文书
大专护理专业自荐信
2015/03/25 职场文书
思想工作总结范文
2015/08/12 职场文书
大学生军训心得体会5篇
2019/08/15 职场文书
MySQL通过binlog恢复数据
2021/05/27 MySQL