【Angular】커스텀 파이프로 드롭다운 항목을 연동시킨다

11434 단어 AngularAngular8

실현하고 싶은 것


  • 특정 목록의 범위를 선택하기 위해 시작과 끝 드롭 다운을 사용하고 싶습니다
  • 시작을 선택하면 종료 드롭 다운에 * 선택한 시작 이후의 항목 만
    *를 표시하고 싶습니다
  • 마찬가지로 종료를 선택하면 시작 드롭 다운에 선택한 종료 이전 항목 만 표시하고 싶습니다.

    요일 목록 예



    초기 상태



    시작에 [물]을 선택한 경우 종료에는 [물, 나무, 금, 토]만 표시된다

    종료에 [금]을 선택한 경우, 시작에는 [일, 월, 불, 물, 나무, 금]만 표시된다


    환경



    node.js


    root@user:/app/my-app# node --version
    v12.7.0
    

    Angular



    package.json
    "dependencies": {
        "@angular/animations": "~8.0.0",
        "@angular/common": "~8.0.0",
        "@angular/compiler": "~8.0.0",
        "@angular/core": "~8.0.0",
        "@angular/forms": "~8.0.0",
        "@angular/platform-browser": "~8.0.0",
        "@angular/platform-browser-dynamic": "~8.0.0",
        "@angular/router": "~8.0.0"
    }
    

    소스 코드



    구성요소



    app.component.ts
    import { Component, OnInit, Pipe, PipeTransform } from '@angular/core';
    
    @Component({
      selector: 'app-dropdown',
      templateUrl: './dropdown.component.html',
      styleUrls: ['./dropdown.component.css']
    })
    export class DropdownComponent implements OnInit {
      days = ['', '', '', '', '', '', ''];
      startDay: string;
      endDay: string;
    
      constructor() {}
    
      ngOnInit() {
        // 初期値の設定
        this.startDay = this.days[0];
        this.endDay = this.days[this.days.length - 1];
      }
    }
    

    맞춤형 파이프



    dayfilter.pipe.ts
    @Pipe({ name: 'dayFilter' })
    export class DayFilterPipe implements PipeTransform {
      transform(days: string[], startDay?: string, endDay?: string) {
        if (startDay) {
          const index = days.findIndex(day => day === startDay);
          return days.slice(index);
        }
        if (endDay) {
          const index = days.findIndex(day => day === endDay);
          return days.slice(0, index + 1);
        }
        return days;
      }
    }
    

    템플릿



    *ngFor에 커스텀 파이프를 설정한다.

    app.component.html
    <div>
      <label>開始</label>
      <select [(ngModel)]="startDay">
        <option
          [ngValue]="day"
          *ngFor="let day of days | dayFilter: undefined:endDay"
          >{{ day }}</option
        >
      </select>
      <label>終了</label>
      <select [(ngModel)]="endDay">
        <option
          [ngValue]="day"
          *ngFor="let day of days | dayFilter: startDay:undefined"
          >{{ day }}</option
        >
      </select>
    </div>
    

    모듈



    사용자 정의 파이프를 declarations에 추가합니다.

    app.module.ts
    import { DayFilterPipe } from './dayfilter.pipe';
    
    @NgModule({
      declarations: [
        // other imports ...
        DayFilterPipe
      ]
    export class AppModule {}
    

    마지막으로



    파이프는 개시용과 종료용으로 나누는 편이 좋을지도.

    참고


  • Pipes
  • 좋은 웹페이지 즐겨찾기