Angular o‘zgarishlarni aniqlash (change detection)
O‘zgarishlarni aniqlash holati o‘zgarganda ko‘rinishni yangilaydi
Aniqlash asoslarini o‘zgartirish
- OnPush: Faqat kirishlar, hodisalar/sinxronlashtirilgan vazifalar va signal yangilanishlarini tekshiradi.
- Signallar: prognoz qilinadigan renderlar uchun holat o‘zgarishlari orqali yangilanishlarni aniq suring.
- Barqaror ro‘yxatlar: DOM buzilishining oldini olish uchun identifikatsiya uchun
track/trackBydan foydalaning.
import { ChangeDetectionStrategy, signal } from '@angular/core';
@Component({ changeDetection: ChangeDetectionStrategy.OnPush })
class Demo {
items = signal([{ id: 1, label: 'A' }]);
add() { this.items.update(a => [...a, { id: Date.now(), label: 'N' }]); }
}
// Template: @for (it of items(); track it.id) { ... }
Misol tushuntirildi
- OnPush: component bashorat qilinadigan tekshiruvlar uchun
ChangeDetectionStrategy.OnPushdan foydalanadi. - Signallar:
items- signal;update()qayta ko‘rsatishni ishga tushirish uchun massivni o‘zgarmas tarzda almashtiradi. - Ro‘yxat identifikatori: DOM tugunlarini saqlash uchun shablon
@forvatrack it.idbilan ishlaydi.
Eslatmalar:
- Bog‘liq: Ro‘yxatlar, signallar va komponentlarga qarang.
- Signallar bilan
OnPushavtomatik ravishda yangilanadi. - DOM buzilishining oldini olish uchun
trackBy(yokitrackbilan@for) dan foydalaning.
OnPush va signallar
OnPush-ni bashorat qilinadigan yangilanishlar uchun signallar bilan birlashtiring.- Shablonlarni oddiy saqlang va holat yangilanishlari orqali o‘zgarishlarni surish.
@Component({ changeDetection: ChangeDetectionStrategy.OnPush })
export class App { count = signal(0); inc() { this.count.set(this.count() + 1); } }
Misol
import { bootstrapApplication } from '@angular/platform-browser';
import { Component, signal, ChangeDetectionStrategy } from '@angular/core';
import { CommonModule } from '@angular/common';
@Component({
selector: 'app-root',
standalone: true,
changeDetection: ChangeDetectionStrategy.OnPush,
imports: [CommonModule],
template: `
<h3>OnPush + Signals</h3>
<p>Count: {{ count() }}</p>
<button (click)="inc()">Increment</button>
<ul>
@for (it of items(); track it.id) {
<li>{{ it.label }}</li>
}
</ul>
`
})
export class App {
count = signal(0);
items = signal([{ id: 1, label: 'A' }, { id: 2, label: 'B' }]);
inc() { this.count.set(this.count() + 1); }
}
bootstrapApplication(App);
<app-root></app-root>
Misol tushuntirildi
- OnPush + signallari:
countsignalini yangilash OnPush ostida yangilanishni ishga tushiradi. - O‘sish:
inc()yangi qiymatni o‘rnatadi (this.count.set(...)), bu ko‘rinishning yangilanishiga sabab bo‘ladi. - Barqaror ro‘yxat: Ro‘yxat DOM buzilishini kamaytirish uchun
@for ... track it.iddan foydalanadi.
Maslahatlar:
- O‘zgarmas yangilanishlar:
OnPusho‘zgarishlarni aniqlashi uchun yangi obyekt/massiv havolalarini yarating. - Chuqur mutatsiyadan saqlaning: havolani almashtirmasdan ichkariga kiritilgan maydonlarni o‘zgartirish qayta ko‘rsatilmasligi mumkin.
- Qachon ishlasa:
OnPushkirish o‘zgarishlarini, voqealar/sinxronlash vazifalari va signal yangilanishlarini tekshiradi.
Signal shakllari
- Olingan qiymatlar uchun
computed()dan foydalaning; faqat bog‘liqliklar o‘zgarganda qayta hisoblaydi. - Nojo‘ya ta’sirlar uchun
effect()dan foydalaning (ro‘yxatga olish, sinxronlash); effektlarni yengil va idempotent saqlang. - Shablonlardagi signallarni ularga chaqirish orqali o‘qing (masalan,
{{ count() }}).
import { signal, computed, effect } from '@angular/core';
const count = signal(0);
const double = computed(() => count() * 2);
effect(() => console.log('double =', double()));
Misol tushuntirildi
- signal(): Holatni ushlab turadi; uni chaqirish orqali o‘qing (
count()). - computed():
countdandoublehosil qiladi va bog‘liqliklar o‘zgarganda qayta hisoblaydi. - Effekt(): Har safar bog‘liqliklar yangilanganda nojo‘ya effektlarni ishga tushiradi (bu yerda jurnalga yozish).
Trek bilan barqaror massivlar
- DOM buzilishining oldini olish uchun
trackdan noyob kalit bilan foydalaning (*ngForuchuntrackBybilan bir xil fikr). - Ro‘yxatni tez va bashoratli ko‘rsatishni davom ettiradi.
@for (it of items(); track it.id) { <li>{{ it.label }}</li> }
Kalit tanlash: Barqaror noyob identifikatorlardan foydalaning; Agar elementlar qayta tartiblanishi mumkin bo‘lsa, massiv indeksidan qoching.
Oqim sintaksisini boshqarish: @for bilan @for (it of items(); track it.id) kabi kuzating.
Holatning saqlanishi: Kuzatuv DOM va component holatini keraksiz ravishda yo‘q qilish/qayta yaratishni oldini oladi.
W3Schools Pathfinder
Yutuqlaringizni kuzating – bu bepul!
