برنامه نویسی

🔥 چه موقع یک مؤلفه `onpush` به روز می شود؟

وقتی یک مؤلفه داشته باشد اپشکر، فقط در صورت بروز آن به روز می شود هر یک از این شرایط:

1⃣ تغییر در @Input()

اگر ارزش @Input() مرجع را تغییر دهید، Angular مؤلفه را به روز می کند.

به روز می شود زیرا مرجع تغییر می کند (شیء جدید)

this.producto = { nombre: 'Nuevo Producto' }; 
// Esto genera una nueva referencia en memoria
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

اگر فقط یک خاصیت داخلی اصلاح شود ، به روز نمی شود

this.producto.nombre = 'Nuevo Producto';
// No cambia la referencia del objeto en memoria, Angular no lo detecta
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

💡 راه حل: برای وادار کردن تشخیص تغییرات ، یک شی جدید را اختصاص دهید:

this.producto = { ...this.producto, nombre: 'Nuevo Producto' };
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید


2⃣ EventOS del Dom (کلیک ، ورودی و غیره)

اگر مؤلفه رویدادی مانند آن داشته باشد (click)با (input)با (change)، و غیره ، Angular تغییر را تشخیص می دهد.


حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

cambiarValor() {
  this.valor = 'Nuevo';
}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

این همیشه به روز می شود نمای ، حتی با OnPushبشر


3 ⃣ استفاده از async در الف | async لوله (مشاهده)

اگر از لوله استفاده می کنید async، Angular هنگامی که قابل مشاهده یک مقدار جدید را منتشر می کند ، به طور خودکار مؤلفه را به روز می کند.

{{ datos$ | async }}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

datos$ = this.http.get('https://api.example.com/data');
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید


4⃣ تغییرات دستی با markForCheck()

اگر نیاز دارید که مؤلفه را به صورت دستی به روز کنید ، می توانید از آن استفاده کنید ChangeDetectorRef.markForCheck()بشر

constructor(private cd: ChangeDetectorRef) {}

actualizar() {
  this.valor = 'Nuevo';
  this.cd.markForCheck(); // 🔥 Forzar actualización
}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید


5⃣ تغییر در یک متغیر در a setTimeout ای setInterval

اگر متغیر را در درون تغییر دهیم setTimeout، زاویه ای آن را تشخیص نمی دهد مگر اینکه ما استفاده کنیم markForCheck()بشر

به طور خودکار به روز نمی شود

setTimeout(() => {
  this.valor = 'Nuevo';
}, 2000);
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

راه حل با markForCheck()

setTimeout(() => {
  this.valor = 'Nuevo';
  this.cd.markForCheck();
}, 2000);
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید


6⃣ بعد از دادخواست HTTP دستی تغییر می کند

اگر مقدار جدیدی را پس از درخواست HTTP بدون آن اختصاص دهیم async، زاویه دار به طور خودکار آن را تشخیص نمی دهدبشر

به طور خودکار به روز نمی شود

this.http.get('https://api.example.com/data').subscribe(data => {
  this.valor = data;
});
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

راه حل با markForCheck()

this.http.get('https://api.example.com/data').subscribe(data => {
  this.valor = data;
  this.cd.markForCheck();
});
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید


7⃣ دوباره تشخیص تغییرات را با reattach()

اگر در هر زمان تشخیص تغییرات با آن غیرفعال شود cd.detach()، ما می توانیم دوباره آن را با آن فعال کنیم reattach()بشر

this.cd.detach(); // 🛑 Detiene la detección
this.cd.reattach(); // 🔄 Reactiva la detección
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید


📌 خلاصه نهایی

اگر یک مؤلفه داشته باشد OnPushبا انفرادی در صورت بروز هر یک از این رویدادها به روز می شود:

واقعه بروزرسانی با OnPush؟
تغییر در @Input() (مرجع جدید) ✅ بله
رویداد DOM (clickبا input، و غیره) ✅ بله
async مشاهده لوله ✅ بله
استفاده markForCheck() ✅ بله
setTimeout ای setInterval ❌ نه (مگر اینکه از آن استفاده کنید markForCheck())
درخواست HTTP (subscribe()) ❌ نه (مگر اینکه از آن استفاده کنید markForCheck())
detach() ❌ نه
reattach() ✅ بله

🎯 پایان

🔹 OnPush بهبود عملکرد زیرا مانع از بررسی زاویه ای در هر چرخه تغییر می شود.

🔹 با این حال ، همچنان به روز می شود در شرایط کلیدی به عنوان تغییر در @Input، رویدادهای del dom با استفاده از آن markForCheck()بشر

🔹 اگر نیاز به تغییر دستی دارید، ایالات متحده markForCheck() ای detectChanges()بشر

حالا شما دارید دانش کامل در OnPush و هنگامی که اجزای به روز می شوند. 🚀🔥

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا