여러 개의 인수가있는 Angular 2 파이프를 어떻게 호출합니까?


204

다음과 같이 파이프를 호출 할 수 있다는 것을 알고 있습니다.

{{ myData | date:'fullDate' }}

여기서 날짜 파이프는 하나의 인수 만 취합니다. 컴포넌트의 템플릿 HTML에서 직접 코드로 더 많은 파라미터를 가진 파이프를 호출하는 구문은 무엇입니까?

답변:


404

구성 요소 템플릿에서 콜론으로 구분하여 여러 인수를 사용할 수 있습니다.

{{ myData | myPipe: 'arg1':'arg2':'arg3'... }}

코드에서 다음과 같이 보일 것입니다.

new MyPipe().transform(myData, arg1, arg2, arg3)

파이프 내부의 변환 함수에서 다음과 같은 인수를 사용할 수 있습니다.

export class MyPipe implements PipeTransform { 
    // specify every argument individually   
    transform(value: any, arg1: any, arg2: any, arg3: any): any { }
    // or use a rest parameter
    transform(value: any, ...args: any[]): any { }
}

베타 16 이전 (2016-04-26)

파이프는 모든 인수를 포함하는 배열을 취하므로 다음과 같이 호출해야합니다.

new MyPipe().transform(myData, [arg1, arg2, arg3...])

그리고 변환 함수는 다음과 같습니다 :

export class MyPipe implements PipeTransform {    
    transform(value:any, args:any[]):any {
        var arg1 = args[0];
        var arg2 = args[1];
        ...
    }
}

8
이 디자인은 바보입니다. 나는 문서를 나는이 문제를 건너마다 확인해야
tom10271

무엇 것 같은 템플릿 비트를 보면 arg1arg2위치를 모두 선택하고 만에 통과 싶어 arg2?
freethebees

undefined첫 번째 인수로 전달하면 기본값이 표시됩니다.
Eran Shabi

3
요즘에는 transform(value:any, arg1:any, arg2:any, arg3:any)나머지 연산자 를 사용하는 대신 기분이 나아집니다.transform(value:any, ...args:any[])
mkb

왜 transform (... args)가 에러를 발생 시키지만 transform (value, ... args)이 아닌가
Sh eldeeb

45

실제 파이프가 없습니다.

{{ myData | date:'fullDate' }}

콜론 (:)으로 여러 매개 변수를 구분할 수 있습니다.

{{ myData | myPipe:'arg1':'arg2':'arg3' }}

또한 파이프를 다음과 같이 연결할 수 있습니다.

{{ myData | date:'fullDate' | myPipe:'arg1':'arg2':'arg3' }}

25

beta.16부터 매개 변수는 transform()더 이상 메소드에 배열로 전달되지 않고 개별 매개 변수로 전달됩니다 .

{{ myData | date:'fullDate':'arg1':'arg2' }}


export class DatePipe implements PipeTransform {    
  transform(value:any, arg1:any, arg2:any):any {
        ...
}

https://github.com/angular/angular/blob/master/CHANGELOG.md#200-beta16-2016-04-26

파이프는 이제 모든 인수를 포함하는 배열이 아닌 가변 개수의 인수를 사용합니다.


무엇 것 같은 템플릿 비트를 보면 arg1arg2위치를 모두 선택하고 만에 통과 싶어 arg2?
freethebees

이외의 다른 변수 이름을 사용할 수 있습니까 arg1? 처럼 isFullDate. 모든 예제가 이것을 사용하기 때문에 묻습니다.
sabithpocker

'arg1''arg2'파이프에 추가 매개 변수로 전달 단지 문자열 리터럴입니다. 해당 범위에서 사용할 수있는 모든 값 또는 참조를 사용할 수 있습니다 (현재 구성 요소 인스턴스)
Günter Zöchbauer

1
@freethebees 당신은 null을 전달있어
karoluS

변환 방법은 배열 인수를 지원하지 않습니다. @Gunter
BALS

5

Angular 2+의 파이프를 사용하여 객체 배열을 필터링합니다. 다음은 여러 개의 필터 인수를 취하지 만 필요에 따라 하나만 보낼 수 있습니다. 다음은 StackBlitz 예제 입니다. 필터링하려는 키를 찾은 다음 제공 한 값으로 필터링합니다. 실제로 매우 간단합니다. 복잡하지 않다면 StackBlitz Example을 확인하십시오 .

* ngFor 지시문에서 호출되는 파이프는 다음과 같습니다.

<div *ngFor='let item of items | filtermulti: [{title:"mr"},{last:"jacobs"}]' >
  Hello {{item.first}} !
</div>

여기 파이프가 있습니다

import { Pipe, PipeTransform } from '@angular/core';

@Pipe({
  name: 'filtermulti'
})
export class FiltermultiPipe implements PipeTransform {
  transform(myobjects: Array<object>, args?: Array<object>): any {
    if (args && Array.isArray(myobjects)) {
      // copy all objects of original array into new array of objects
      var returnobjects = myobjects;
      // args are the compare oprators provided in the *ngFor directive
      args.forEach(function (filterobj) {
        let filterkey = Object.keys(filterobj)[0];
        let filtervalue = filterobj[filterkey];
        myobjects.forEach(function (objectToFilter) {
          if (objectToFilter[filterkey] != filtervalue && filtervalue != "") {
            // object didn't match a filter value so remove it from array via filter
            returnobjects = returnobjects.filter(obj => obj !== objectToFilter);
          }
        })
      });
      // return new array of objects to *ngFor directive
      return returnobjects;
    }
  }
}

필터링 할 객체가 포함 된 Component는 다음과 같습니다.

import { Component } from '@angular/core';
import { FiltermultiPipe } from './pipes/filtermulti.pipe';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  title = 'app';
  items = [{ title: "mr", first: "john", last: "jones" }
   ,{ title: "mr", first: "adrian", last: "jacobs" }
   ,{ title: "mr", first: "lou", last: "jones" }
   ,{ title: "ms", first: "linda", last: "hamilton" }
  ];
}

StackBlitz 예제

GitHub 예제 :이 예제의 작업 사본을 포크하십시오.

* Gunter가 제공 한 답변에서 Gunter는 어레이가 더 이상 필터 인터페이스로 사용되지 않지만 제공하는 링크를 검색하여 해당 주장에 대해 말하는 것을 발견하지 못했습니다. 또한 제공된 StackBlitz 예제는 Angular 6.1.9에서 의도 한대로 작동하는이 코드를 보여줍니다. Angular 2 이상에서 작동합니다.

행복한 코딩 :-)


여러 매개 변수를 파이프에 직접 전달하는 대신 여러 항목이있는 단일 배열을 전달할 필요가 없습니다.
BrunoJCM

배열은 객체를 포함합니다. 개체에는 열 이름을 사용하여 열의 행 값과 일치하는 레코드를 찾을 수있는 동적 쿼리를 만드는 데 사용되는 여러 키 값 쌍이 포함될 수 있습니다. CSV 매개 변수를 전달하는이 수준의 동적 쿼리는 얻을 수 없습니다.
user3777549

-2

확장 : user3777549

한 세트의 데이터에 대한 다중 값 필터 (제목 키만 참조)

HTML

<div *ngFor='let item of items | filtermulti: [{title:["mr","ms"]},{first:["john"]}]' >
 Hello {{item.first}} !
</div>

필터 여러

args.forEach(function (filterobj) {
    console.log(filterobj)
    let filterkey = Object.keys(filterobj)[0];
    let filtervalue = filterobj[filterkey];
    myobjects.forEach(function (objectToFilter) {

      if (!filtervalue.some(x=>x==objectToFilter[filterkey]) && filtervalue != "") {
        // object didn't match a filter value so remove it from array via filter
        returnobjects = returnobjects.filter(obj => obj !== objectToFilter);
      }
    })
  });
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.