/angular-guide > _

ფაიფის შექმნა

ამ თავში ვისწავლით ფაიფების შექმნას.

წინასწარ გამზადებული გვაქვს სტრინგების მასივი და საფილტრო სიტყვა, რომლის მიხედვითაც გვინდა ამ მასივის გაფილტვრა:

import { Component } from "@angular/core";
import { CommonModule } from "@angular/common";

@Component({
  selector: "app-root",
  standalone: true,
  imports: [CommonModule],
  templateUrl: "./app.component.html",
  styleUrl: "./app.component.css",
})
export class AppComponent {
  filterKey = "";
  items = [
    "Some example text here",
    "Angular is an awesome framework",
    "ZA WARUDOO",
    "Learn Angular, it's worth it",
    "On step at a time",
  ];
}

თემფლეითში ეს მნიშვნელობები გამოსახული გვაქვს NgIf დირექტივით. ასევე NgModel დირექტივის საშუალებით filtlerKey ში ვნახავთ ყოველ ახალ ტექსტს, რომელსაც მომხმარებელი input-ში შეიყვანს:

<p>filter</p>
<input type="text" [(ngModel)]="filterKey" />
<hr />
<p *ngFor="let item of items">{{ item }}</p>

როგორღაც, შეცვლილი filterKey-ს მიხედვით უნდა შევცვალოთ NgFor დირექტივით დარენდერებული სია. სწორედ ამისთვის გამოგვადგება ფაიფი.

შევქმნათ ფაიფი, რომელიც ტექსტის მასივს გაფილტრავს ჩვენ მიერ მიწოდებული საძიებო სიტყვის მიხედვით. ფაიფის შექმნა შეიძლება ხელით, ან ანგულარის CLI-ს დახმარებით.

ng generate pipe my-filter

ანგულარი შექმნის ფაილს, რომელიც შეიცავს ჩვენი ფაიფის სახელს + .pipe.ts. ამ ფაილში დაექსpორტებულია ჩვენი ფაიფის კლასი, რომელიც Pipe დეკორატორით არის შექმნილი. ამ დეკორატორში შეგვიძლია ფაიფის კონფიგურაცია, მათ შორის იმ სახელის, რომლითაც ამ ფაიფს თემფლეითში გამოვიყენებთ. ჩვენი ფაიფის კლასი თავის მხრივ აუცილებლად იმპლემენტაციას უკეთებდეს PipeTransform ინტერფეისს. PipeTransform ინტერფეისი საჭიროებს რომ კლასში არსებობდეს transform მეთოდი. ეს მეთოდი ყველა ფაიფს გააჩნია, თუმცა ყველა მათგანი თავისებურად მუშაობს. ჩვენც, რა თქმა უნდა, ის ჩვენ ამოცანას უნდა მოვარგოთ.

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

@Pipe({
  name: "myFilter",
  standalone: true,
})
export class MyFilterPipe implements PipeTransform {
  transform(value: string[], filterKey: string): string[] {
    return value.filter((item) =>
      item.toLowerCase().includes(filterKey.toLowerCase())
    );
  }
}

transform მეთოდი ორ პარამეტრს იღებს, value არის ის მნიშვნელობა, რომელიც უნდა გავფილტროთ, ხოლო მეორე პარამეტრიდან იწყება ის არგუმენტები, რომლელსაც ჩვენ ფაიფის გამოყენებისას მივაწვდით. ჩვენ გვინდა, რომ გავფილტროთ სტგრინგების მასივი რაღაც სიტყვის მიხედვით და ამიტომ ჩვენ დავაბრუნებთ გაფილტრული სტრინგების მასივს, სადაც თითოეული ელემენტი (ლოუერქეისში) შეიცავს საფილტრო სიტყვას (ლოუერქეისში).

დარწმუნდით, რომ ჩვენი ფაიფი დამატებულია შესაბამისი კომპონენტის იმპორტების სიაში, რათა მისი გამოყენება შევძლოთ:

/* ... */
import { MyFilterPipe } from "./my-filter.pipe";

@Component({
  selector: "app-root",
  standalone: true,
  imports: [CommonModule, MyFilterPipe],
})
export class AppComponent {
  /* ... */
}

ახლა შეგვიძლია ფილტრის გამოყენება:

<p>filter</p>
<input type="text" [(ngModel)]="filterKey" />
<hr />
<p *ngFor="let item of items | myFilter : filterKey">{{ item }}</p>

ჩვენი ფილტრის filter ფუნქციაში value არგუმენტი გამოდის items მასივი, ხოლო filterKey პარამეტრი გამოდის ჩვენს კომპონენტში არსებული filterKey, რომელსაც ngModel-ის საშუალებით მომხმარებლის მიერ შეყვანილი მნიშვნელობა ეძლევა და ანგულარ items-ს ტრანსფორმაციას უკეთებს და აბრუნებს მასივს მხოლოდ იმ ელემენტებიც, რომლებიც ველში შეყვანილ სიტყვას შეიცავენ.

შეჯამება

ამ თავში ჩვენ შევქმენით ფილტრის ფაიფი, რომლითაც ტექსტის მასივი გავფილტრეთ NgIf დირექტივში, input ველში შეყვანილი ტექსტის მიხედვით.