مرجع سینتکس قالب
مرجع سینتکس قالب در انگولار، هسته اصلی تعامل بین کامپوننتها و DOM است و امکان مدیریت دادهها و رویدادها به صورت دیکلراتیو را فراهم میکند. این مرجع شامل تمامی قواعد و سینتکسهایی است که توسعهدهندگان برای بایندینگ داده، استفاده از دایرکتیوها، مدیریت رویدادها و ارتباط بین کامپوننتها به آن نیاز دارند. در توسعه برنامههای مدرن وب و SPA، تسلط بر سینتکس قالب برای ساخت کامپوننتهای قابل استفاده مجدد، بهینه و قابل نگهداری حیاتی است.
با استفاده از این سینتکس، توسعهدهندگان میتوانند interpolation، property binding، event binding، two-way binding، structural directives مانند ngIf و ngFor و template reference variables مانند #var را به شکل مؤثر پیادهسازی کنند. این ابزارها به مدیریت وضعیت (state management)، جریان داده (data flow) و lifecycle کامپوننتها کمک کرده و از prop drilling و re-render غیرضروری جلوگیری میکنند.
در این مرجع، شما یاد میگیرید چگونه کامپوننتهای قابل استفاده مجدد بسازید، دادهها را به صورت مؤثر بین کامپوننتها منتقل کنید و از lifecycle hooks برای مدیریت مؤثر DOM و state استفاده نمایید. همچنین، تمرکز بر بهینهسازی عملکرد، مدیریت state و امنیت برنامههای انگولار مدرن خواهد بود تا شما بتوانید پروژههای حرفهای SPA را با بهترین استانداردهای انگولار توسعه دهید.
مثال پایه
typescriptimport { Component, ViewChild, ElementRef } from '@angular/core';
@Component({
selector: 'app-counter',
template: ` <h2>کنتور ساده</h2> <p #counterDisplay>{{ counter }}</p> <button (click)="increment()">افزایش</button>
`
})
export class CounterComponent {
counter: number = 0;
@ViewChild('counterDisplay', { static: true }) counterElem!: ElementRef<HTMLParagraphElement>;
increment() {
this.counter++;
console.log('مقدار کنتور:', this.counterElem.nativeElement.textContent);
}
}
در این مثال، CounterComponent
ایجاد شده است. با استفاده از template reference variable #counterDisplay
، المان <p>
شناسایی و با @ViewChild
به صورت type-safe در TypeScript دسترسی پیدا میکند. تابع increment()
مقدار counter را افزایش داده و آن را در console نمایش میدهد.
Interpolation با {{ counter }}
باعث بهروزرسانی خودکار UI میشود که نمونهای از unidirectional data flow در انگولار است. این الگو از prop drilling جلوگیری میکند و state محلی کامپوننت را مدیریت مینماید. این روش در ساخت فرمها، کامپوننتهای dynamic و تعاملات پیچیده کاربرد دارد و پایهای برای استفاده در پروژههای واقعی است.
مثال کاربردی
typescriptimport { Component, Input, ViewChild, ElementRef, AfterViewInit } from '@angular/core';
@Component({
selector: 'app-message',
template: ` <div #messageBox class="message-box">{{ message }}</div>
`,
styles: ['.message-box { padding: 10px; border: 1px solid #ccc; margin-top: 10px; }']
})
export class MessageComponent implements AfterViewInit {
@Input() message: string = '';
@ViewChild('messageBox') box!: ElementRef<HTMLDivElement>;
ngAfterViewInit() {
console.log('پیام نمایش داده شده:', this.box.nativeElement.textContent);
}
}
@Component({
selector: 'app-root',
template: ` <h1>اپلیکیشن پیام</h1> <app-message [message]="userMessage"></app-message> <input [(ngModel)]="userMessage" placeholder="پیام خود را وارد کنید" />
`
})
export class AppComponent {
userMessage: string = 'سلام انگولار!';
}
Advanced انگولار Implementation
typescriptimport { Component, ViewChild, ElementRef, ChangeDetectionStrategy, AfterViewInit } from '@angular/core';
import { BehaviorSubject } from 'rxjs';
@Component({
selector: 'app-live-counter',
template: ` <h2>کنتور پیشرفته</h2> <p #display>{{ counter$ | async }}</p> <button (click)="increment()">افزایش</button>
`,
changeDetection: ChangeDetectionStrategy.OnPush
})
export class LiveCounterComponent implements AfterViewInit {
private counterSubject = new BehaviorSubject<number>(0);
counter$ = this.counterSubject.asObservable();
@ViewChild('display') displayElem!: ElementRef<HTMLParagraphElement>;
increment() {
this.counterSubject.next(this.counterSubject.value + 1);
}
ngAfterViewInit() {
console.log('مقدار اولیه کنتور:', this.displayElem.nativeElement.textContent);
}
}
در مرجع سینتکس قالب، استفاده درست از ViewChild
، مدیریت state با BehaviorSubject
و جریان داده reactive، و استفاده از ChangeDetectionStrategy.OnPush نمونهای از بهترین practices برای جلوگیری از re-render غیرضروری است.
خطاهای رایج شامل prop drilling، دستکاری مستقیم state و دسترسی به DOM قبل از init هستند. ابزارهایی مانند Angular DevTools و unit tests برای رفع مشکلات و دیباگ توصیه میشوند. برای امنیت، از دستکاری مستقیم DOM و دادههای ناامن جلوگیری کنید و از Angular sanitizer بهره ببرید. این روشها امکان ساخت کامپوننتهای modular، پرسرعت و maintainable در SPAها را فراهم میکنند.
📊 مرجع کامل
انگولار Element/Method | Description | Syntax | Example | Notes |
---|---|---|---|---|
template reference variable | دسترسی به المان محلی | #varName | <input #username /> | با @ViewChild دسترسی پیدا میکند |
@ViewChild | دسترسی به template reference | @ViewChild('var') varElem | @ViewChild('username') inputEl | static: true/false |
@ViewChildren | دسترسی به چند reference مشابه | @ViewChildren('var') elems | @ViewChildren('item') items | QueryList برمیگرداند |
ngIf | رندر شرطی | *ngIf="condition" | <div *ngIf="isVisible"></div> | نمایش/مخفی کردن المان |
ngFor | رندر حلقهای | *ngFor="let item of items" | <li *ngFor="let i of list">{{i}}</li> | استفاده از trackBy توصیه میشود |
ngClass | استایل پویا | [ngClass]="{'class': condition}" | <div [ngClass]="{'active': isActive}"></div> | پذیرش object/array/string |
ngStyle | استایل inline پویا | [ngStyle]="{'color': color}" | <p [ngStyle]="{'font-size.px': size}"></p> | CSS inline |
@Input | ورودی parent→child | @Input() prop | @Input() message:string; | Data binding |
@Output | خروجی child→parent | @Output() event = new EventEmitter() | @Output() changed = new EventEmitter<number>() | EventEmitter |
ngModel | Two-way binding | [(ngModel)]="value" | <input [(ngModel)]="username" /> | نیاز به FormsModule |
AfterViewInit | Lifecycle hook | ngAfterViewInit() | ngAfterViewInit() {…} | پس از ایجاد view |
ChangeDetectionStrategy | Default/OnPush | Default | استراتژی تشخیص تغییرات | بهینهسازی render |
BehaviorSubject | Reactive state | new BehaviorSubject(initial) | counter$ = new BehaviorSubject(0) | Observable با مقدار اولیه |
📊 Complete انگولار Properties Reference
Property | Values | Default | Description | انگولار Support |
---|---|---|---|---|
static | true/false | false | زمان initialization @ViewChild | Angular 8+ |
read | ElementRef/TemplateRef/Component | ElementRef | نوع داده inject شده | Angular 8+ |
trackBy | Function | undefined | بهینهسازی ngFor | Angular 2+ |
changeDetection | Default/OnPush | Default | استراتژی تشخیص تغییرات | Angular 2+ |
encapsulation | Emulated/None/ShadowDom | Emulated | CSS encapsulation | Angular 2+ |
providers | Array | [] | DI services | Angular 2+ |
animations | Array | [] | Animationهای component | Angular 4+ |
interpolation | Array | ['{{','}}'] | سینتکس interpolation | Angular 2+ |
preserveWhitespaces | true/false | true | حفظ فاصله سفید | Angular 2+ |
outputs | Array | [] | خروجیهای component | Angular 2+ |
inputs | Array | [] | ورودیهای component | Angular 2+ |
host | Object | {} | Host bindings/listeners | Angular 2+ |
مرجع سینتکس قالب پایهای برای ساخت کامپوننتهای قابل استفاده مجدد و بهینه در انگولار است. توسعهدهندگان با تسلط بر این مرجع میتوانند جریان داده، مدیریت state و lifecycle را به شکل موثری کنترل کنند. برای یادگیری پیشرفتهتر، مطالعه @Input/@Output، Angular Forms، RxJS Observables و دایرکتیوهای پیشرفته توصیه میشود. تمرین در پروژههای واقعی و مطالعه مستندات رسمی، درک عمیق و تسلط بر سینتکس قالب را تضمین میکند.
🧠 دانش خود را بیازمایید
دانش خود را بیازمایید
خود را با این آزمون تعاملی به چالش بکشید و ببینید موضوع را چقدر خوب درک کردهاید
📝 دستورالعملها
- هر سوال را با دقت بخوانید
- بهترین پاسخ را برای هر سوال انتخاب کنید
- میتوانید آزمون را هر چند بار که میخواهید تکرار کنید
- پیشرفت شما در بالا نمایش داده میشود