مرجع دکوراتورها
در انگولار، دکوراتورها (Decorators) توابع ویژهای هستند که به کلاسها، پروپرتیها، متدها یا پارامترها متادیتا اضافه میکنند و به فریمورک اطلاع میدهند که این عناصر چگونه باید رفتار کنند. مرجع دکوراتورها در انگولار اهمیت بالایی دارد زیرا پایهای برای ساخت کامپوننتهای قابل استفاده مجدد، مدیریت state، جریان داده و کنترل چرخه حیات (lifecycle) در برنامههای مدرن وب و SPA است.
دکوراتورهای اصلی شامل @Component، @Directive، @Pipe، @Injectable و @NgModule هستند. @Component برای تعریف کامپوننتهای UI، @Directive برای ایجاد دستورات سفارشی، @Pipe برای تبدیل دادهها در template، @Injectable برای تزریق وابستگیها و @NgModule برای سازماندهی کلاسها در ماژول استفاده میشوند. دکوراتورهای اضافی مانند @Input و @Output جریان داده بین کامپوننتهای والد و فرزند را مدیریت میکنند و @ViewChild و @ContentChild دسترسی به فرزند یا محتوای project شده را ممکن میسازند.
این مرجع به توسعهدهندگان کمک میکند تا با بهترین شیوهها، مثالهای عملی و تکنیکهای بهینهسازی، کامپوننتهای scalable و maintainable بسازند و از اشتباهاتی مانند prop drilling، رندرهای غیرضروری و تغییر مستقیم state جلوگیری کنند. پس از مطالعه این مرجع، خواننده قادر خواهد بود دکوراتورها را به طور مؤثر در پروژههای واقعی انگولار پیادهسازی کند.
مثال پایه
typescriptimport { Component, Input } from '@angular/core';
@Component({
selector: 'app-user-card',
template: ` <div class="card"> <h2>{{ name }}</h2> <p>سن: {{ age }}</p> </div>
`,
styles: [` .card {
padding: 16px;
border-radius: 8px;
background-color: #f9f9f9;
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
text-align: center;
}
`]
})
export class UserCardComponent {
@Input() name!: string;
@Input() age!: number;
}
در این مثال، دکوراتور @Component کلاس UserCardComponent را به یک کامپوننت قابل استفاده مجدد تبدیل میکند. selector برای تعریف تگ HTML کامپوننت استفاده میشود و template و styles ظاهر و استایل کامپوننت را مشخص میکنند. دکوراتورهای @Input به کامپوننت اجازه میدهند دادهها را از والد دریافت کند که از prop drilling جلوگیری میکند و مدیریت state را سادهتر میسازد.
چرخه حیات انگولار به صورت خودکار initialization، render و destruction کامپوننت را مدیریت میکند. تغییرات در @Input پروپرتیها باعث بهروزرسانی خودکار view میشود و رندرهای غیرضروری کاهش مییابد. این مثال نشان میدهد که چگونه دکوراتورها جریان داده، مدیریت state و ساختار کامپوننت را در پروژههای واقعی کنترل میکنند.
مثال کاربردی
typescriptimport { Component, Input, Output, EventEmitter } from '@angular/core';
@Component({
selector: 'app-counter',
template: ` <div class="counter"> <h3>شمارنده: {{ count }}</h3> <button (click)="increment()">+</button> <button (click)="decrement()">-</button> </div>
`,
styles: [` .counter {
display: flex;
gap: 10px;
align-items: center;
justify-content: center;
}
`]
})
export class CounterComponent {
@Input() count: number = 0;
@Output() countChange = new EventEmitter<number>();
increment() {
this.count++;
this.countChange.emit(this.count);
}
decrement() {
this.count--;
this.countChange.emit(this.count);
}
}
Advanced انگولار Implementation
typescriptimport { Component, Input, Output, EventEmitter, OnInit, OnChanges, SimpleChanges } from '@angular/core';
@Component({
selector: 'app-smart-counter',
template: ` <div class="smart-counter"> <h3>شمارنده هوشمند: {{ value }}</h3> <button (click)="increase()">+</button> <button (click)="decrease()">-</button> </div>
`,
styles: [` .smart-counter {
background-color: #e0f7fa;
padding: 16px;
border-radius: 12px;
text-align: center;
}
`]
})
export class SmartCounterComponent implements OnInit, OnChanges {
@Input() value: number = 0;
@Output() valueChange = new EventEmitter<number>();
ngOnInit() {
console.log('SmartCounter initialized with value:', this.value);
}
ngOnChanges(changes: SimpleChanges) {
if (changes['value']) {
console.log('Value changed:', changes['value'].currentValue);
}
}
increase() {
this.value++;
this.valueChange.emit(this.value);
}
decrease() {
this.value--;
this.valueChange.emit(this.value);
}
}
SmartCounterComponent با استفاده از دکوراتورهای @Input و @Output و lifecycle hooks مانند OnInit و OnChanges دادهها را بهصورت واکنشگرا مدیریت میکند و تغییرات را به والد اعلام میکند. دکوراتورها این کامپوننت را قابل استفاده مجدد، بهینه و ایمن میسازند و از prop drilling و رندرهای غیرضروری جلوگیری میکنند. این ترکیب جریان داده و مدیریت state را کنترل میکند و کامپوننتی scalable و maintainable ایجاد مینماید.
بهترین شیوهها و خطاهای رایج: از @Input فقط برای دادههای ضروری و از @Output برای eventهای مشخص استفاده کنید. از تغییر مستقیم state و prop drilling بیش از حد خودداری کنید. برای بهبود عملکرد، ChangeDetectionStrategy.OnPush را اعمال نمایید. با استفاده از Angular DevTools فعالیت lifecycle و EventEmitter را پایش کنید. از تزریق دادههای ناامن پرهیز و template checking را فعال نمایید. استفاده صحیح از دکوراتورها به ساخت اپلیکیشنهای انگولار امن، بهینه و مقیاسپذیر کمک میکند.
📊 مرجع کامل
انگولار Element/Method | Description | Syntax | Example | Notes |
---|---|---|---|---|
@Component | تعریف یک کامپوننت | @Component({...}) | @Component({ selector:'app-demo', template:'...' }) | پرکاربردترین دکوراتور |
@Directive | ایجاد دستور سفارشی | @Directive({...}) | @Directive({ selector:'[highlight]' }) | برای رفتار DOM |
@Pipe | تبدیل داده | @Pipe({...}) | @Pipe({name:'capitalize'}) | برای تغییر نمایش دادهها |
@NgModule | تعریف ماژول | @NgModule({...}) | @NgModule({ declarations:[], imports:[] }) | سازماندهی کامپوننتها |
@Injectable | تزریق وابستگی | @Injectable({...}) | @Injectable({ providedIn:'root' }) | مورد نیاز برای DI |
@Input | ورودی کامپوننت | @Input() prop:type | @Input() title:string | دریافت داده از والد |
@Output | خروجی کامپوننت | @Output() event=new EventEmitter() | @Output() clicked=new EventEmitter() | ارسال داده به والد |
@HostListener | شنود eventهای DOM | @HostListener('click') handler(){} | @HostListener('window:scroll') onScroll() | بایندینگ event |
@ViewChild | دسترسی به فرزند | @ViewChild(ChildComponent) child!:ChildComponent | دستکاری instance | |
@ContentChild | دسترسی به محتوای project شده | @ContentChild(TemplateRef) tpl!:TemplateRef | مدیریت template content | |
@HostBinding | بایندینگ property ها | @HostBinding('class.active') isActive=true | بایندینگ داینامیک DOM |
📊 Complete انگولار Properties Reference
Property | Values | Default | Description | انگولار Support |
---|---|---|---|---|
selector | string | none | selector کامپوننت | تمام نسخهها |
template | string | none | template کامپوننت | 2+ |
styles | array | string[] | none | CSS کامپوننت |
providers | array | [] | Dependency providers | 2+ |
inputs | array | [] | لیست @Input | 4+ |
outputs | array | [] | لیست @Output | 4+ |
animations | array | [] | انیمیشنها | 4+ |
changeDetection | string | 'Default' | استراتژی Change Detection | 5+ |
encapsulation | string | 'Emulated' | CSS encapsulation | 2+ |
standalone | boolean | false | کامپوننت standalone | 14+ |
imports | array | [] | ماژولهای وارد شده | 14+ |
schemas | array | [] | اجازه عناصر سفارشی | 9+ |
یادگیری مرجع دکوراتورها در انگولار به توسعهدهندگان امکان میدهد کامپوننتهای قابل استفاده مجدد، بهینه و مقیاسپذیر بسازند. این دانش جریان داده، مدیریت state و چرخه حیات را کنترل میکند. گام بعدی شامل یادگیری Dependency Injection، lifecycle hooks، Change Detection Strategy و مدیریت دادههای asynchronous با RxJS است. این مهارتها مسیر حرفهای در توسعه انگولار را هموار میسازند.
🧠 دانش خود را بیازمایید
دانش خود را بیازمایید
خود را با این آزمون تعاملی به چالش بکشید و ببینید موضوع را چقدر خوب درک کردهاید
📝 دستورالعملها
- هر سوال را با دقت بخوانید
- بهترین پاسخ را برای هر سوال انتخاب کنید
- میتوانید آزمون را هر چند بار که میخواهید تکرار کنید
- پیشرفت شما در بالا نمایش داده میشود