پارامترهای URL در انگولار — به زبان ساده

۲۲۸ بازدید
آخرین به‌روزرسانی: ۱۱ شهریور ۱۴۰۲
زمان مطالعه: ۳ دقیقه
پارامترهای URL در انگولار — به زبان ساده

در این مقاله با روش بازیابی پارامترهای URL در انگولار و رشته کوئری آشنا خواهیم شد. غالباً دیده می‌شود که افراد در مورد مسیریابی در انگولار دچار سردرگمی می‌شوند. به طور خاص این سردرگمی در مورد بازیابی پارامترها از URL و رشته کوئری وجود دارد. این کار نسبتاً ساده‌ای است و با بررسی یک مثال به سادگی آموخته می‌شود. در این مقاله قصد داریم چنین کاری را انجام دهیم.

997696

مسیرها

با توجه به مقاصد این راهنما روی پارامترهای مسیر متمرکز می‌شویم.

می‌خواهیم یک مسیر به صورت animals/:animal ایجاد کنیم. در این مسیر می‌توانیم به بخش‌های animals/dog یا animals/cat برویم تا به ترتیب یکی از موارد dog یا cat را از پارامتر ‎:animal بازیابی کنیم.

1{ path: "animals/:animal", component: AnimalsComponent }

علامت دونقطه موجب می‌شود که بخش دوم URL به یک پارامتر تبدیل شود.

دستیابی به URL

انگولار یک شیء ActivatedRoute در اختیار ما قرار می‌دهد. به این ترتیب می‌توانیم URL را از طریق این شیء مورد دستیابی قرار دهیم، اما ابتدا باید آن را در کامپوننت تزریق کنیم. این کار را مانند تزریق یک سرویس انجام می‌دهیم:

1import { ActivatedRoute } from "@angular/router";
2constructor(private route: ActivatedRoute) { }

دستیابی به پارامترهای URL

به طور کلی دو روش پذیرفته شده برای دستیابی به پارامترهای URL وجود دارد. یکی از طریق route.snapshot.paramMap و دیگری از طریق route.paramMap.subscribe است. تفاوت اصلی بین این دو روش آن است که اشتراک در زمانی که پارامتر برای یک مسیر خاص تغییر می‌یابد، همچنان به‌روزرسانی شود یا نه.

اسنپ‌شات

استفاده از اسنپ‌شات چنان که از نام آن مشخص است، رویدادی یک‌بارمصرف است. یک کاربرد معمول آن دریافت پارامتر در زمان بارگذاری کامپوننت است. در کد زیر زمانی که کامپوننت بارگذاری می‌شود، پارامتر URL را دریافت خواهیم کرد.

1ngOnInit() {
2  this.animal = this.route.snapshot.paramMap.get("animal")
3}

این راهبرد در صورتی که پارامتر درون آن کامپوننت تغییر یابد کار نخواهد کرد. به بیان صریح‌تر تغییر از animals/dog به animals/cat موجب تخریب و مقداردهی AnimalComponent نمی‌شود و از این رو متد ngOnInit برای بار دوم فراخوانی نمی‌شود.

اشتراک

استفاده از اشتراک (subscription)‌ در این راهبرد مانند هر اشتراک دیگر است. اگر تغییری در مقدار observable وجود داشته باشد، به تابع Callback ارسال می‌شود. این راهبرد در صورتی مفید است که پارامتر (های) URL درون مسیر جاری تغییر یابند:

1ngOnInit() {
2  this.route.paramMap.subscribe(params => {
3    this.animal = params.get("animal")
4  })
5}

این راهبرد ممکن است زیاده‌روی به نظر برسد، اما قطعاً یک راهبرد امن محسوب می‌شود. ضمناً دیگر نیازی به اشتراک در paramMap وجود ندارد. زمانی که کامپوننت مسیریابی‌شده از بین برود، نیز از بین می‌رود و از این رو اشتراک نیز نابود خواهد شد.

دستیابی به پارامترهای کوئری

دستیابی به پارامترهای رشته کوئری فرایندی مشابه پارامترهای URL دارد. صرفاً از مشخصه متفاوتی روی شیء ActivatedRoute به نام ActivatedRoute استفاده می‌شود. بنابراین همه آن اصول به صورت مشابه اعمال می‌شوند، اما باید مطمئن شوید که از مشخصه صحیحی استفاده می‌کنید.

1ngOnInit() {
2  this.name = this.route.snapshot.queryParamMap.get("paramName")
3  this.route.queryParamMap.subscribe(queryParams => {
4    this.name = queryParams.get("paramName")
5  })
6}

نکته پیشرفته: استفاده از switchMap

switchMap موجب لغو شدن یک درخواست در زمان وارد شدن درخواست جدید می‌شود. برای نمونه اگر در paramMap مشترک باشیم و تغییرهای مکرری در پارامترهای مسیر ایجاد کنیم، switchMap همه درخواست‌های معلق را لغو کرده و درخواست جدید را می‌گیرد. این حالت در اغلب موارد زیاده‌روی محسوب می‌شود، اما می‌تواند مفید باشد:

1import { switchMap } from "rxjs/operators" // RxJS v6
2ngOnInit() {
3  this.route.paramMap.pipe(
4    switchMap(params => {
5      this.animal = params.get("animal")
6    })
7  )
8}

در کد فوق به بررسی درخواست HTTP درون switchMap می‌پردازیم. در ادامه آن را کمی بیشتر بررسی می‌کنیم:

1import { switchMap } from "rxjs/operators" // RxJS v6
2ngOnInit() {
3  this.route.paramMap.pipe(
4    switchMap(params => {
5      this.animal = params.get("animal")
6    })
7  )
8}

در مثال فوق، یک درخواست HTTP درون اشتراک paramMap ارسال می‌کنیم. چنان که می‌دانیم درخواست‌های HTTP نسبتاً پرهزینه هستند. اگر این تغییرها به صورت مکرر رخ بدهند، باید درخواست‌های قبلی لغو شوند. در این حالت استفاده از switchMap این کار را انجام می‌دهد و از این رو یک بهبود عملکردی محسوب می‌شود.

سخن پایانی

دریافت پارامترها از URL در انگولار کار آسانی است. کافی است از اسنپ‌شات برای دریافت یک‌باره و یا از اشتراک برای دریافت متعدد پارامترهای متغیر درون یک کامپوننت یا مسیر استفاده کنیم. اگر یک درخواست HTTP درون اشتراک ارسال می‌شود، در این صورت باید از switchMap برای لغو همه درخواست‌های معلق غیر ضروری استفاده کنیم.

اگر این مطلب برای شما مفید بوده است، آموزش‌های زیر نیز به شما پیشنهاد می‌شوند:

==

بر اساس رای ۰ نفر
آیا این مطلب برای شما مفید بود؟
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
منابع:
better-programming
نظر شما چیست؟

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