তুমি এখন Angular-এর signals + effect + reactive forms একসাথে use করছো — এটা advanced level 🔥
চল effect() টা একদম clear করি 👇
🔹 effect() কী?
👉 effect() = Angular-এর reactive system-এর একটা feature
👉 এটা automatically run হয় যখন কোনো signal change হয়
🔥 সহজভাবে
“যখন signal change হবে → এই function আবার run করো”
🔹 তোমার code টা
effectRef = effect(() => {
const data = this.categoryRefValue();
if (data) {
this.editCategoryForm.patchValue({
categoryName: data.name,
categoryUrl: data.urlHandle
});
}
});
🔥 এখানে কী হচ্ছে step-by-step
✅ 1. this.categoryRefValue()
👉 এটা একটা signal
মানে:
- API থেকে data আসলে এই value change হবে
✅ 2. effect(() => { ... })
👉 Angular observe করছে:
this.categoryRefValue()
👉 যখনই এটা change হবে:
➡️ ভিতরের function আবার run হবে
🔥 Flow
API call → data আসে → signal update → effect trigger → form update
🔹 কেন এটা দরকার?
তুমি form manually update করছো না
👉 Angular নিজেই sync করছে
🔥 Without effect (old way 😓)
this.categoryServices.getCategoryById(id).subscribe(data => {
this.editCategoryForm.patchValue({
categoryName: data.name,
categoryUrl: data.urlHandle
});
});
👉 manual subscription
👉 messy code
🔥 With effect (clean 🔥)
effect(() => {
const data = this.categoryRefValue();
if (data) {
this.editCategoryForm.patchValue(...);
}
});
👉 automatic
👉 reactive
👉 clean
খুবই চমৎকার একটি প্রশ্ন! কেন আমরা সরাসরি FormControl-এর ভেতরে ডাটা বসাতে পারলাম না, আর কেনই বা effect দরকার হলো—এর পেছনে ২টো প্রধান কারণ আছে:
১. এপিআই ডাটা “দেরিতে” আসে (Asynchronous Nature)
যখন তোমার EditCategory কম্পোনেন্টটি লোড হয়, তখন তোমার কোডগুলো খুব দ্রুত রান করে। কিন্তু ডাটাবেজ থেকে ক্যাটাগরির ডাটা আসতে কিছুটা সময় লাগে (হয়তো ৫০০ মিলিসেকেন্ড বা ১ সেকেন্ড)।
- সরাসরি বসালে কী হতো: তুমি যদি
FormControlতৈরি করার সময় ডাটা দিতে চাইতে, তখন ডাটাবেজ থেকে রেজাল্ট আসার আগেই ফর্ম তৈরি হয়ে যেত। ফলে তোমার ফর্মটি খালি ('') থেকে যেত। - Effect-এর কাজ:
effectহলো অনেকটা একজন “পাহারাদারের” মতো। সে সবসময় তোমারcategoryRefValueসিগন্যালটার দিকে তাকিয়ে থাকে। যখনই এপিআই থেকে ডাটা এসে ওই সিগন্যালে ঢোকে,effectসাথে সাথে জেগে ওঠে এবংpatchValueদিয়ে ফর্মের ভেতর ডাটাগুলো ঢুকিয়ে দেয়।
২. সিগন্যাল এবং রিঅ্যাক্টিভিটি (Reactivity)
অ্যাঙ্গুলারের নতুন সিগন্যাল সিস্টেমে httpResource ডাটা আসার পর নিজে থেকেই আপডেট হয়। effect ব্যবহার করার সুবিধা হলো:
- এটি ডাটা আসার জন্য “অপেক্ষা” করে।
- ডাটা আসা মাত্রই সেটি ফর্মের সাথে সিঙ্ক (Sync) করে দেয়।
কেন আমরা সরাসরি এভাবে লিখলাম না?
TypeScript
// এটা কাজ করবে না
categoryName: new FormControl(this.categoryRefValue().name)
কারণ: যখন এই লাইনটি রান হবে, তখন categoryRefValue() এর মান থাকবে undefined (যেহেতু এপিআই কল তখনো শেষ হয়নি)। তাই ফর্মে কোনো নাম দেখাবে না।
সংক্ষেপে effect কী?
effect হলো এমন একটি ফাংশন যা এর ভেতরে থাকা Signal-গুলোর ওপর নজর রাখে। যখনই সিগন্যালের মান পরিবর্তন হয়, সে তার ভেতরের কোডটুকু (যেমন: patchValue) আবার রান করে।
প্রো-টিপ (যদি effect ব্যবহার করতে না চাও):
তুমি যদি effect ব্যবহার না করতে চাও, তবে তোমার সার্ভিসের subscribe মেথড ব্যবহার করে ডাটা ফর্মে বসাতে পারতে। কিন্তু যেহেতু তুমি মডার্ন Signal-based এপ্রোচে ( httpResource ) আছ, তাই effect ব্যবহার করাটাই সবচেয়ে সঠিক এবং স্ট্যান্ডার্ড উপায়।
এখন কি বোঝা গেল কেন আমরা সরাসরি না বসিয়ে effect দিয়ে ডাটা পুশ করলাম? এটি মূলত ডাটা আসার “টাইমিং” মেলানোর জন্য।