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一种取同级值的方式(比如你在GridView中)
Mar 15 Javascript
Jquery实现由下向上展开效果的例子
Dec 08 Javascript
AngularJS学习笔记之基本指令(init、repeat)
Jun 16 Javascript
js点击文本框弹出可选择的checkbox复选框
Feb 03 Javascript
微信小程序 tabs选项卡效果的实现
Jan 05 Javascript
微信小程序 template模板详解及实例代码
Mar 09 Javascript
纯js实现页面返回顶部的动画(超简单)
Aug 10 Javascript
node使用Mongoose类库实现简单的增删改查
Nov 08 Javascript
在 Angular-cli 中使用 simple-mock 实现前端开发 API Mock 接口数据模拟功能的方法
Nov 28 Javascript
小程序hover-class点击态效果实现
Feb 26 Javascript
Django+Vue实现WebSocket连接的示例代码
May 28 Javascript
JS document对象简单用法完整示例
Jan 14 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+mysqli实现批量替换数据库表前缀的方法
2014/12/29 PHP
Symfony2学习笔记之系统路由详解
2016/03/17 PHP
TP5(thinkPHP5框架)实现显示错误信息及行号功能的方法
2019/06/03 PHP
由prototype_1.3.1进入javascript殿堂-类的初探
2006/11/06 Javascript
Jquery中增加参数与Json转换代码
2009/11/20 Javascript
JavaScript与DOM组合动态创建表格实例
2012/12/23 Javascript
JS中Iframe之间传值的方法
2013/03/11 Javascript
网页整体变灰白色(兼容各浏览器)实例
2013/04/21 Javascript
jquery实现文字由下到上循环滚动的实例代码
2013/08/09 Javascript
JS刷新当前页面的几种方法总结
2013/12/24 Javascript
推荐10个2014年最佳的jQuery视频插件
2014/11/12 Javascript
JavaScript检测弹出窗口是否已经关闭的方法
2015/03/24 Javascript
微信小程序 石头剪刀布实例代码
2017/01/04 Javascript
jQuery实现选中行变色效果(实例讲解)
2017/07/06 jQuery
基于Jquery Ajax type的4种类型(详解)
2017/08/02 jQuery
浅析Vue 生命周期
2018/06/21 Javascript
微信小程序template模版的使用方法
2019/04/13 Javascript
layui问题之自动滚动二级iframe页面到指定位置的方法
2019/09/18 Javascript
JavaScript语法约定和程序调试原理解析
2020/11/03 Javascript
Python实现的飞速中文网小说下载脚本
2015/04/23 Python
深入理解python中的select模块
2017/04/23 Python
Python基于百度AI的文字识别的示例
2018/04/21 Python
和孩子一起学习python之变量命名规则
2018/05/27 Python
ERLANG和PYTHON互通实现过程详解
2019/07/05 Python
python有序查找算法 二分法实例解析
2020/02/18 Python
Python实现将元组中的元素作为参数传入函数的操作
2020/06/05 Python
Python改变对象的字符串显示的方法
2020/08/01 Python
Django视图类型总结
2021/02/17 Python
Funko官方商店:源自美国,畅销全球搪胶收藏玩偶
2018/09/15 全球购物
美国地毯购买网站:Rugs USA
2019/02/23 全球购物
亚洲航空公司官方网站:AirAsia
2019/11/25 全球购物
个人简历自我评价
2014/02/02 职场文书
劳动竞赛活动总结
2014/05/05 职场文书
娱乐节目策划方案
2014/06/10 职场文书
2015年护士节慰问信
2015/03/23 职场文书
利用python调用摄像头的实例分析
2021/06/07 Python