مروری بر پایپها
در انگولار، پایپها ابزار قدرتمندی برای تبدیل دادهها در قالبهای HTML هستند بدون آنکه نیاز به تغییر مستقیم در state کامپوننت باشد. مروری بر پایپها به توسعهدهندگان اجازه میدهد دادهها را به شکل دلخواه نمایش دهند، فرمتبندی کنند، یا فیلتر نمایند، در حالی که ساختار و جریان دادهها در برنامه حفظ میشود. این قابلیت باعث افزایش خوانایی کد و بهبود عملکرد در برنامههای تک صفحهای (SPA) میشود.
استفاده از پایپها نیازمند درک مفاهیم کلیدی انگولار مانند کامپوننتها، مدیریت state، جریان داده و lifecycle hooks است. پایپها میتوانند built-in یا custom باشند و میتوانند pure یا impure تعریف شوند. این ویژگیها به توسعهدهنده امکان میدهد تا transformationهای پیچیده داده را به شکل modular و reusable در سراسر پروژه به کار گیرد.
در این آموزش، شما یاد میگیرید چگونه از پایپهای استاندارد انگولار استفاده کنید، پایپهای سفارشی بسازید، و آنها را در کامپوننتها برای مدیریت state و بهبود عملکرد یکپارچه کنید. همچنین روشهای بهینهسازی و جلوگیری از مشکلات رایج مانند prop drilling و رندرهای غیرضروری را خواهید آموخت. این دانش برای توسعه برنامههای مدرن وب و SPA با Angular حیاتی است.
مثال پایه
typescriptimport { Component, Pipe, PipeTransform } from '@angular/core';
@Pipe({ name: 'uppercaseText' })
export class UppercaseTextPipe implements PipeTransform {
transform(value: string): string {
return value.toUpperCase();
}
}
@Component({
selector: 'app-pipe-demo',
template: ` <h2>نمونه پایپ پایه</h2> <p>متن اصلی: {{ text }}</p> <p>متن تبدیل شده: {{ text | uppercaseText }}</p>
`
})
export class PipeDemoComponent {
text: string = 'به انگولار خوش آمدید';
}
در مثال بالا، UppercaseTextPipe یک پایپ سفارشی است که متن ورودی را به حروف بزرگ تبدیل میکند. این پایپ از PipeTransform پیروی کرده و متد transform() را پیادهسازی میکند که داده ورودی را گرفته و خروجی تغییر یافته را بازمیگرداند. در کامپوننت PipeDemoComponent، پایپ با استفاده از عملگر | در قالب HTML اعمال شده است.
این رویکرد بهترین شیوههای انگولار را رعایت میکند زیرا منطق transformation از کامپوننت جدا شده و قابلیت استفاده مجدد و نگهداری کد را افزایش میدهد. به دلیل pure بودن پایپ، transform() تنها زمانی فراخوانی میشود که داده ورودی تغییر کند، که از رندرهای غیرضروری جلوگیری میکند. این مثال همچنین یکپارچگی پایپها با lifecycle کامپوننت و مدیریت state را نشان میدهد.
مثال کاربردی
typescriptimport { Component, Pipe, PipeTransform } from '@angular/core';
@Pipe({ name: 'filterItems' })
export class FilterItemsPipe implements PipeTransform {
transform(items: string[], searchTerm: string): string[] {
if (!items || !searchTerm) return items;
return items.filter(item => item.toLowerCase().includes(searchTerm.toLowerCase()));
}
}
@Component({
selector: 'app-advanced-pipe-demo',
template: ` <h2>نمونه فیلتر کردن لیست</h2> <input [(ngModel)]="searchTerm" placeholder="کلمه کلیدی را وارد کنید"> <ul> <li *ngFor="let item of items | filterItems:searchTerm">{{ item }}</li> </ul>
`
})
export class AdvancedPipeDemoComponent {
items: string[] = ['سیب', 'پرتقال', 'موز', 'انگور', 'گلابی'];
searchTerm: string = '';
}
در این مثال کاربردی، FilterItemsPipe برای فیلتر کردن یک آرایه بر اساس کلمه جستجو استفاده شده است. پایپ آرایه و searchTerm را دریافت کرده و آرایه فیلتر شده را برمیگرداند. با استفاده از ngModel و two-way binding، state کامپوننت به صورت real-time بروزرسانی میشود و پایپ با جریان داده یکپارچه کار میکند.
جدا نگه داشتن منطق transformation در پایپ باعث میشود کامپوننت تنها مسئول مدیریت state و تعامل با کاربر باشد. pure بودن پایپ باعث بهبود عملکرد میشود زیرا transform() فقط زمانی فراخوانی میشود که ورودی تغییر کند. این مثال الگوی مناسب برای استفاده از پایپها در پروژههای بزرگ انگولار را نشان میدهد.
بهترین شیوهها و اشتباهات رایج در انگولار: استفاده از پایپهای pure برای بهینهسازی عملکرد، جدا کردن منطق transformation از کامپوننتها، و جلوگیری از تغییر مستقیم state کامپوننت داخل پایپها. پایپها کمک میکنند تا از prop drilling و رندرهای غیرضروری جلوگیری شود.
برای دیباگ و بررسی عملکرد، از Angular DevTools استفاده کنید و مطمئن شوید ورودی و خروجی پایپها شفاف و predictable باشند. محاسبات سنگین نباید داخل transform() قرار داده شوند. از نظر امنیتی، دادههای ورودی کاربر باید sanitize شوند تا از حملات XSS جلوگیری شود. رعایت این اصول باعث میشود پایپها در SPA های Angular امن، سریع و قابل نگهداری باشند.
📊 جدول مرجع
انگولار Element/Concept | Description | Usage Example |
---|---|---|
Pipe | تبدیل داده در قالب بدون تغییر state | {{ text |
Pure Pipe | فقط هنگام تغییر ورودی transform() را اجرا میکند | @Pipe({ name: 'filterItems', pure: true }) |
Custom Pipe | منطق transformation سفارشی | class FilterItemsPipe implements PipeTransform |
Async Pipe | پردازش دادههای غیرهمزمان مثل Observable یا Promise | {{ observableData |
Built-in Pipe | پایپهای آماده Angular مانند DatePipe و CurrencyPipe | {{ today |
خلاصه و مراحل بعدی: با تسلط بر پایپها، توسعهدهندگان میتوانند دادهها را به شکل مؤثر در قالبها نمایش دهند، منطق قابل استفاده مجدد بسازند و نگهداری کامپوننتها را آسانتر کنند. پایپها جریان داده شفاف و مدیریت state پایدار را تشویق میکنند و با lifecycle کامپوننتها یکپارچه میشوند.
گام بعدی شامل یادگیری impure pipes، استفاده از Async Pipe با Observables/Promises و ترکیب چند پایپ با هم است. پایپهای سفارشی خود را در لایه سرویس یا چند کامپوننت به کار ببرید و بر تحلیل عملکرد و بهینهسازی تمرکز کنید. استفاده از داکیومنتیشن رسمی و پروژههای عملی باعث تعمیق یادگیری خواهد شد.
🧠 دانش خود را بیازمایید
دانش خود را بیازمایید
خود را با این آزمون تعاملی به چالش بکشید و ببینید موضوع را چقدر خوب درک کردهاید
📝 دستورالعملها
- هر سوال را با دقت بخوانید
- بهترین پاسخ را برای هر سوال انتخاب کنید
- میتوانید آزمون را هر چند بار که میخواهید تکرار کنید
- پیشرفت شما در بالا نمایش داده میشود