Як мені викликати кутову 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
Ця конструкція нерозумна. Мені потрібно перевіряти документ щоразу, коли я
стикаюся з

Як би виглядав біт шаблону, якщо arg1і arg2де обидва необов’язкові, і ви хотіли лише пройти arg2?
вільнолюби

якщо ви передасте undefinedяк перший аргумент, він отримає значення за замовчуванням.
Еран Шабі

3
в наш час замість transform(value:any, arg1:any, arg2:any, arg3:any)використання відпочинку оператор почуває себе краще, я думаю:transform(value:any, ...args:any[])
mkb

чому transform (... args) викликає помилку, але transform (значення, ... 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

Тепер труби беруть змінну кількість аргументів, а не масив, який містить усі аргументи.


Як би виглядав біт шаблону, якщо arg1і arg2де обидва необов’язкові, і ви хотіли лише пройти arg2?
вільнолюби

Чи можемо ми використовувати різні імена змінних, крім arg1? Як isFullDate. Я просто запитую, тому що кожен приклад використовує це.
sabithpocker

'arg1'і 'arg2'є просто літеральними рядками, переданими як додаткові параметри до труби. Ви можете використовувати будь-яке значення або посилання, що є в цьому масштабі (поточний екземпляр компонента)
Günter Zöchbauer

1
@freethebees ти повинен пройти null
karoluS

метод перетворення не підтримує аргументи масиву good point @Gunter
BALS

5

Я використовую Труби в кутовій 2+ для фільтрації масивів об'єктів. Нижче наведено кілька аргументів фільтра, але ви можете надіслати лише один, якщо це відповідає вашим потребам. Ось приклад StackBlitz . У ньому знайдуться ключі, за якими ви хочете відфільтрувати, а потім фільтруєте за поданим вами значенням. Насправді це досить просто, якщо це звучить складно, це не так, ознайомтеся з прикладом StackBlitz .

Ось труба викликається в директиві * 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;
    }
  }
}

Ось компонент, що містить об'єкт для фільтрації,

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.
користувач3777549

-2

Розширено від: user3777549

Багатоцільовий фільтр для одного набору даних (лише посилання на ключ заголовка)

HTML

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

filterMultiple

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);
      }
    })
  });
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.