>  기사  >  웹 프론트엔드  >  각도에서 ng-alain을 기반으로 자신만의 선택 구성 요소를 정의하는 방법은 무엇입니까?

각도에서 ng-alain을 기반으로 자신만의 선택 구성 요소를 정의하는 방법은 무엇입니까?

亚连
亚连원래의
2018-06-05 09:36:563198검색

이 글에서는 주로 ng-alain을 기반으로 자체 선택 구성 요소를 정의하는 Angle의 예를 소개하고 참고용으로 제공합니다.

1 -select2.comComponent.ts 페이지, 코드에 주석이 있습니다. 코드는 다음과 같습니다:


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

3, 그리고 my-select2.service.ts 페이지, 여기에서는 주로 drop-을 요청합니다. 백그라운드 인터페이스에서 반환된 하위 배열의 경우 URL은 상위 구성 요소에서 전달된 링크이며 코드는 다음과 같습니다.


import { ControlValueAccessor } from &#39;@angular/forms/src/directives&#39;;
import { Component, forwardRef, Input,OnInit,ElementRef,Output,EventEmitter} from &#39;@angular/core&#39;;
import { NG_VALUE_ACCESSOR } from &#39;@angular/forms&#39;;
import { Router, NavigationEnd } from &#39;@angular/router&#39;;
import { FormGroup, FormBuilder, Validators } from &#39;@angular/forms&#39;;
import { SelectService } from &#39;./my-select2.service&#39;;
declare var $: any;
@Component({
 selector: &#39;nz-select2&#39;,
 templateUrl: &#39;./my-select2.component.html&#39;,
 providers: [ 
     {
      provide: NG_VALUE_ACCESSOR,
      useExisting: forwardRef(() => NzSelect2Component),//注入表单控件
      multi: true
     }]
})
export class NzSelect2Component implements OnInit{
  constructor(private selectService:SelectService) { 
  }
 innerValue: any = &#39;&#39;; 
 //监听绑定的值,与外岑的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: &#39;text&#39;,
     value: &#39;value&#39;
  };
 @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;
 }
}

4 그런 다음 myselect.module.ts 페이지가 표시됩니다. 이 구성 요소를 사용하는 것은 'ng-zorro-antd'에서 import { NzSelectModule }을 도입하는 것입니다. 코드는 다음과 같습니다:


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

5 사용 방법은 필요한 모듈에 도입하세요: MySelectModule


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

export class MySelectModule {
  constructor() {

  }
}

6. 호출 방법: url은 배경을 요청하는 인터페이스이고 fieldKey는 배열 형식입니다. 여기서는 배경에서 반환된 형식에 따라 필드를 정의할 수 있습니다. 예: 백그라운드 반환 형식은 [{dmsm1:5,dmz:5}]이고 fieldKey는 다음과 같이 정의됩니다. myPlaceHolder는 초기화 중에 표시되는 콘텐츠이며, 로컬 배열인 경우에는 [dataSource]=만 추가하면 됩니다. "peer", 여기서 피어는 로컬 배열입니다

import { MySelectModule } from &#39;bizapp/base/components/myselect/myselect.module&#39;;

7. 요약: 이 구성 요소를 통해 URL과 fieldKey만 수정하면 모든 모듈에서 이를 도입하고 사용할 수 있으므로 코드 사용이 줄어들고 유지 관리가 쉽습니다

위의 내용은 모든 사람을 위해 정리한 내용입니다. 앞으로 모든 사람에게 도움이 되기를 바랍니다.

관련 기사:

노드 타이머 지식의 자세한 해석

Es6의 Generator 함수에 대한 자세한 분석


JavaScript의 Array filter() 메서드를 사용하여 압축된 희소 배열 구현


위 내용은 각도에서 ng-alain을 기반으로 자신만의 선택 구성 요소를 정의하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.