Làm cách nào để gọi một ống Angular 2 có nhiều đối số?


204

Tôi biết tôi có thể gọi một đường ống như thế này:

{{ myData | date:'fullDate' }}

Ở đây, ống ngày chỉ mất một đối số. Cú pháp để gọi một đường ống có nhiều tham số hơn, từ HTML mẫu của thành phần và trực tiếp trong mã là gì?

Câu trả lời:


404

Trong mẫu của thành phần, bạn có thể sử dụng nhiều đối số bằng cách tách chúng bằng dấu hai chấm:

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

Từ mã của bạn, nó sẽ trông như thế này:

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

Và trong hàm biến đổi bên trong đường ống của bạn, bạn có thể sử dụng các đối số như thế này:

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 { }
}

Beta 16 trở về trước (2016-04-26)

Các ống có một mảng chứa tất cả các đối số, vì vậy bạn cần gọi chúng như thế này:

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

Và chức năng biến đổi của bạn sẽ trông như thế này:

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

8
Thiết kế này là ngớ ngẩn. Tôi cần kiểm tra tài liệu mỗi khi tôi gặp phải vấn đề này
tom10271

Bit mẫu sẽ trông như thế nào nếu arg1arg2cả hai tùy chọn và bạn chỉ muốn truyền vào arg2?
freethebees

nếu bạn vượt qua undefinedlàm đối số đầu tiên, nó sẽ nhận giá trị mặc định.
Eran Shabi

3
Ngày nay, thay vì transform(value:any, arg1:any, arg2:any, arg3:any)sử dụng toán tử nghỉ, tôi nghĩ tốt hơn:transform(value:any, ...args:any[])
mkb

tại sao biến đổi (... args) gây ra lỗi, nhưng biến đổi (giá trị, ... args) thì không?
Sh eldeeb

45

Bạn đang thiếu đường ống thực tế.

{{ myData | date:'fullDate' }}

Nhiều tham số có thể được phân tách bằng dấu hai chấm (:).

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

Ngoài ra, bạn có thể chuỗi ống, như vậy:

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

25

Kể từ phiên bản beta.16, các tham số không được truyền dưới dạng mảng cho transform()phương thức nữa mà thay vào đó là các tham số riêng lẻ:

{{ 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

bây giờ các ống có số lượng đối số thay đổi và không phải là một mảng chứa tất cả các đối số.


Bit mẫu sẽ trông như thế nào nếu arg1arg2cả hai tùy chọn và bạn chỉ muốn truyền vào arg2?
freethebees

Chúng ta có thể sử dụng các tên biến khác nhau arg1không? Thích isFullDate. Tôi chỉ hỏi bởi vì mọi ví dụ sử dụng điều này.
sabithpocker

'arg1''arg2'chỉ là chuỗi ký tự được truyền dưới dạng tham số bổ sung cho đường ống. Bạn có thể sử dụng bất kỳ giá trị hoặc tham chiếu nào có sẵn trong phạm vi đó (ví dụ thành phần hiện tại)
Günter Zöchbauer

1
@freethebees bạn phải vượt qua null
karoluS

phương thức biến đổi không hỗ trợ mảng lập luận điểm tốt @Gunter
BALS

5

Tôi sử dụng ống trong Angular 2+ để lọc các mảng của các đối tượng. Sau đây có nhiều đối số bộ lọc nhưng bạn chỉ có thể gửi một đối số nếu phù hợp với nhu cầu của bạn. Đây là một ví dụ StackBlitz . Nó sẽ tìm các khóa bạn muốn lọc và sau đó lọc theo giá trị bạn cung cấp. Nó thực sự khá đơn giản, nếu nó có vẻ phức tạp thì không, hãy xem ví dụ StackBlitz .

Đây là ống được gọi trong một lệnh * ngFor,

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

Đây là ống,

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;
    }
  }
}

Và đây là Thành phần chứa đối tượng cần lọc,

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" }
  ];
}

Ví dụ về StackBlitz

Ví dụ về GitHub: Lấy một bản sao làm việc của ví dụ này tại đây

* Xin lưu ý rằng trong câu trả lời do Gunter cung cấp, Gunter nói rằng các mảng không còn được sử dụng làm giao diện bộ lọc nhưng tôi đã tìm kiếm liên kết mà anh ta cung cấp và không tìm thấy điều gì nói với yêu cầu đó. Ngoài ra, ví dụ StackBlitz được cung cấp cho thấy mã này hoạt động như dự định trong Angular 6.1.9. Nó sẽ hoạt động trong Angular 2+.

Mã hóa hạnh phúc :-)


Không có điểm nào trong việc truyền một mảng đơn có nhiều mục thay vì truyền trực tiếp nhiều tham số cho đường ống.
BrunoJCM

Mảng chứa các đối tượng. Các đối tượng có thể chứa nhiều cặp giá trị khóa được sử dụng để tạo các truy vấn động nơi bạn có thể tìm kiếm các bản ghi khớp bằng các tên cột so với các giá trị hàng của cột. Bạn sẽ không nhận được mức truy vấn động này thông qua các tham số CSV.
dùng3777549

-2

Mở rộng từ: user3777549

Bộ lọc đa giá trị trên một bộ dữ liệu (chỉ tham chiếu đến khóa tiêu đề)

HTML

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

bộ lọc

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);
      }
    })
  });
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.