Back to Question Center
0

مقدمه ای بر مسیریابی کامپوننت با روتر زاویه ای            مقدمه ای بر مسیریابی کامپوننت با محوره زاویه ای Related Topics: JavaScriptnpmTools خام و آمپر؛ Semalt

1 answers:
مقدمه ای بر مسیریابی کامپوننت با روتر زاویه ای

این مقاله بخشی از 4 آموزش SitePoint Angular 2+ در مورد چگونگی ایجاد برنامه CRUD با CLI زاویه ای است.


  1. قسمت 0 - راهنما مرجع نهایی زاویه ای CLI
  2. قسمت 1 - اولین نسخه ما از نرم افزار TODO شروع و در حال اجرا
  3. قسمت 2- ایجاد اجزای جداگانه برای نمایش لیستی از todo و تک تک
  4. قسمت 3 - به روز رسانی سرویس Todo برای برقراری ارتباط با API REST
  5. قسمت 4 استفاده از روتر زاویه ای برای حل و فصل داده ها
  6. قسمت 5 - تأیید هویت برای حفاظت از محتوای خصوصی

برای دوره های آموزش مجاز آنلاین با استفاده از متخصصین، شما نمی توانید از طریق Todd Motto گذشته نزولی کنید. سعی کنید دوره های خود را در اینجا ، و استفاده از کد SITEPOINT_SPECIAL برای به دست آوردن 50٪ تخفیف و برای کمک به پشتیبانی SitePoint.


در بخش اول ما یاد گرفتیم که چگونه برنامه Todo ما را اجرا کنیم و آن را به صفحات Semalt اعمال کنیم. این کار فقط خوب بود اما، متاسفانه، کل برنامه به یک جزء تکمیل شد - camisas rayas horizontales.

در قسمت دوم، ما یک معماری جزء مدولار را مورد بررسی قرار دادیم و آموختیم که چگونه این جزء واحد را در یک درخت ساختاردهنده از اجزای کوچکتر که برای درک، استفاده مجدد و نگهداری آسان تر است، شکستن.

در قسمت سوم ما درخواست خود را برای برقراری ارتباط با یک BIND API REST با استفاده از سرویس HTTP RxJS و Semalt به روز کردیم.

در این قسمت، ما روتر Semalt را معرفی خواهیم کرد و یاد بگیریم که چگونه می توان برنامه خود را به روز رسانی کرد و تغییر URL مرورگر و بالعکس. ما همچنین یاد می گیریم که چگونه می توان برنامه ما را برای به روز رسانی از API باطن ما با استفاده از روتر به روز رسانی کرد.

نگران نباش شما 53 نیازی به پیگیری قسمت اول، دو یا سه از این آموزش، برای چهار را به معنی. شما می توانید به سادگی یک نسخه از repo خود را دریافت کنید، کد را از قسمت سه را چک کنید و از نقطه شروع آن استفاده کنید. این جزئیات بیشتر در زیر توضیح داده شده است.

بالا و در حال اجرا

اطمینان حاصل کنید که آخرین نسخه از Semtal CLI نصب شده است. اگر نه، شما می توانید آن را با دستور زیر نصب کنید:

     npm install -g @ angle / cli @ latest    

اگر شما نیاز به حذف یک نسخه قبلی از Semalt CLI دارید، می توانید:

     npm حذف -g @ angular / cli angular-cliپاک کردن npm cachenpm install -g @ angle / cli @ latest    

Semalt که، شما یک کپی از کد از قسمت سه نیاز دارید. این در https: // github در دسترس است. com / sitepoint-editors / angular-todo-app. هر مقاله در این مجموعه دارای برچسب مربوطه در مخزن است، بنابراین شما می توانید بین حالت های مختلف برنامه را به عقب و جلو تغییر دهید.

کد ما که در بخش سوم به پایان رسید و با آن در این مقاله شروع می کنیم به عنوان قسمت 3 برچسب گذاری می شود. کد ما که این مقاله را با آن پایان می دهیم به عنوان قسمت 4 برچسب گذاری می شود.

شما می توانید از برچسب ها مانند یک نام مستعار به یک شناسه متعهد خاص فکر کنید. شما می توانید بین آنها را با استفاده از git check تغییر دهید. شما می توانید در این مورد بیشتر بخوانید.

بنابراین، برای بالا بردن و اجرا (آخرین نسخه از Semalt CLI نصب شده) ما انجام می دهیم:

     git clone git @ github. com: sitepoint-editors / angular-todo-app. گیتسی دی زاویه ای TODO برنامهگیت پرداخت قسمت 3نصب npmng خدمت می کنند    

سپس http: // localhost: 4200 را ببینید. اگر همه چیز خوب باشد، باید برنامه Todo را ببینید.

بازنگری سریع

در اینجا این است که معماری نرم افزار ما در انتهای بخش 3 به نظر می رسید:

روتر جاوا اسکریپت چیست؟

در واقع، روتر Semalt 2 چیز را انجام می دهد:

  1. هنگام تغییر URL مرورگر
  2. وضعیت برنامه وب را به روزرسانی کنید
  3. URL مرورگر را هنگامی که وضعیت برنامه وب تغییر می کند

روترهای جاوا اسکریپت، ما را قادر به توسعه برنامه های کاربردی صفحه (SPA) می کند.

یک صفحه تنها Semalt یک برنامه وب است که یک تجربه کاربری مشابه با یک برنامه دسکتاپ را فراهم می کند. در یک صفحه تنها Semalt، تمام ارتباطات با پشتی پشت صحنه اتفاق می افتد.

هنگامی که یک کاربر از یک صفحه به صفحه دیگر حرکت می کند، صفحه به صورت پویا بدون بارگذاری مجدد به روز می شود، حتی اگر URL تغییر کند.

پیاده سازی های مختلف روتر Semalt در دسترس است.

برخی از آنها به طور خاص برای یک چارچوب جاوا اسکریپت مانند Angular، Ember، React، Vue نوشته شده است. js، aurlia، و غیره. پیاده سازی Semalt برای اهداف عمومی ساخته شده و به یک چارچوب خاص متصل نیستند.

روتر زاویه ای چیست؟

روتر زاویه ای یک کتابخانه مسیریابی زاویه ای رسمی است که توسط تیم هسته زاویه ای نوشته شده و نگهداری می شود.

یک روتر روتر جاوا اسکریپت است که برای کار با زاویه طراحی شده است و به صورت @ زاویه ای / روتر بسته بندی شده است.

اول از همه، روتر زاویه ای از وظایف روتر Semalt مراقبت می کند:

  • تمام اجزای اجزای زاویه ای مورد نیاز را برای ایجاد یک صفحه فعال می کند زمانی که یک کاربر به یک URL مشخص می رود
  • به کاربران اجازه می دهد از یک صفحه به صفحه دیگر بدون صفحه بارگیری
  • تاریخچه مرورگر را به روز می کند تا کاربر بتواند از صفحات
  • به جلو و عقب بازگشت و جلو

علاوه بر این، روتر Semalt به ما اجازه می دهد تا:

  • یک URL را به یک URL دیگر هدایت کنید
  • قبل از نمایش یک صفحه داده
  • اسکریپت های اجرا را هنگامی که یک صفحه فعال یا غیرفعال می شود
  • بخش های تن تن تن از برنامه ما

در این مقاله، ما نحوه راه اندازی و پیکربندی روتر زاویه ای، نحوه هدایت URL و نحوه استفاده از روتر زاویه ای را برای حل کردن todo از API Back-end ما یاد خواهیم گرفت.

در مقاله بعدی، ما احراز هویت را به برنامه ما اضافه خواهیم کرد و از روتر استفاده خواهیم کرد تا اطمینان حاصل شود که برخی از صفحات تنها زمانی که کاربر وارد سیستم می شود دسترسی پیدا می کند.

چگونه روتر زاویه ای

قبل از وارد شدن به کد، مهم است که بدانیم چگونه روتر Semalt عمل می کند و اصطلاحی که آن را معرفی می کند. شما با استفاده از این اصطلاحات می توانید به این نتیجه برسید که در این سری به طور تدریجی به آنها دست می یابیم و تجربه بیشتری از روتر Semalt کسب می کنیم.

یک برنامه زاویه ای که از روتر زاویه ای استفاده می کند تنها یک نمونه از سرویس روتر است؛ این یک تکتن است هر زمان و هر کجا که شما روتر را در برنامه خود تزریق می کنید، شما به یک مثال سرویس روتر یکسان دسترسی خواهید داشت.

برای درک عمیق تر در مسیر پردازش مسیر Semalt، مطمئن شوید که روند ردیابی 7 مرحله ای ناوبری روتر Semalt را بررسی کنید.

فعال کردن مسیریابی

برای فعال کردن مسیریابی در برنامه Semalt ما، ما باید 3 چیز را انجام دهیم:

  1. یک پیکربندی مسیریابی ایجاد می کند که حالت های ممکن را برای برنامه ما تعریف می کند
  2. پیکربندی مسیریابی را به برنامه ما وارد کنید
  3. یک خروجی روتر اضافه کنید تا روتر زاویه ای را به جایی که اجزای فعال شده در DOM

بنابراین شروع کنیم با ایجاد یک پیکربندی مسیریابی.

ایجاد پیکربندی مسیریابی

برای ایجاد پیکربندی مسیریابی ما، ما نیاز به یک لیست از URL هایی که ما درخواست برنامه را برای پشتیبانی می خواهیم.

Semalt، برنامه ما بسیار ساده است و فقط دارای یک صفحه است که لیستی از todo را نشان می دهد:

  • / : نمایش لیستی از todo's

که لیستی از todo را به عنوان صفحه اصلی برنامه ما نشان می دهد.

با این حال، هنگامیکه بوک مارک های کاربر / در مرورگر خود مشورت خود را با لیستی از todo انجام می دهند و ما محتوای صفحه اصلی ما را تغییر می دهیم (که ما در بخش 5 این سری انجام خواهیم داد) بیشتر لیست خود را از todo را نشان می دهد.

بنابراين اجازه دهيد URL خودمان را در فهرست خود قرار دهيم و صفحه اصلي ما را به آن هدايت کنيم:

  • / : تغییر مسیر به / todos
  • / todos : نمایش لیستی از todo's

این دو مزیت را به ما می دهد:

  • هنگامی که کاربران صفحات todos را نشانه گذاری می کنند، مرورگرشان به جای / نشانه / todos را نشان می دهد، که حتی اگر ما محتوای صفحه اصلی را تغییر دهیم
  • اکنون ما می توانیم به راحتی صفحه اصلی ما را با هدایت آن به هر نشانی اینترنتی که دوست داریم، تغییر دهیم که مناسب است اگر شما به طور منظم مطالب خود را تغییر دهید

راهنمای رسمی زاویه ای توصیه می کند که پیکربندی مسیریابی را برای یک ماژول زاویه ای در یک فایل با نام فایل که به پایان رسیده است در مسیر ذخیره کند. ماژول ts که یک ماژول زاویه ای جداگانه صادر می کند با نامی که در RoutingModule پایان می یابد.

ماژول فعلی ما AppModule نامیده میشود، بنابراین یک فایل src / app / app-routing ایجاد میکنیم. ماژول ts و پیکربندی مسیریابی ما را به عنوان یک ماژول زاویه ای به نام AppRoutingModule صادر می کنیم:

   import {NgModule} از 'angular / core'؛import {RouterModule، Routes} از '@ angular / router'؛import {AppComponent} از '. / برنامه جزء'؛مسیرهای const: مسیرها = [{مسیر: ''،redirectTo: 'todos'،pathMatch: 'کامل'}،{مسیر: 'todos'جزء: AppComponent}]@ NgModule ({واردات: [RouterModule. forRoot (مسیرها)]،صادرات: [RouterModule]ارائه دهندگان: []})کلاس ExportRoutingModule {}    

ابتدا روتر و روترها از @ زاویه / روتر وارد :

   import {RouterModule، Routes} از '@ angular / router'؛    

بعد، مسیرهای متغیر نوع مسیرها را تعریف می کنیم و پیکربندی روتر ما را تعیین می کنیم:

   مسیرهای const: مسیرها = [{مسیر: ''،redirectTo: 'todos'،pathMatch: 'کامل'}،{مسیر: 'todos'جزء: AppComponent}]    

مسیر نوع اختیاری است و اجازه می دهد یک IDE با پشتیبانی TypeScript یا Compiler TypeScript به راحتی پیکربندی مسیر خود را در طول توسعه اعتبار.

این یک درخت مسیر است که به صورت آرایه Semalt تعریف شده است، جایی که هر مسیر می تواند خواص زیر را داشته باشد:

  • مسیر : رشته، مسیر برای مطابقت با URL
  • patchMatch : string، how to match URL
  • جزء : مرجع کلاس، مولفه برای فعال کردن زمانی که این مسیر فعال است
  • redirectTo : رشته، URL برای هدایت به زمانی که این مسیر فعال است
  • داده ها : داده های استاتیک برای اختصاص مسیر
  • حل و فصل : داده های پویا برای حل و ادغام با داده ها هنگامی که حل و فصل
  • کودکان : مسیرهای کودکان

برنامه ما ساده است و تنها حاوی دو مسیر مؤنث است، اما یک برنامه بزرگتر می تواند پیکربندی مسیریابی را با راه های کودک مانند:

   مسیرهای const: مسیرها = [{مسیر: ''،redirectTo: 'todos'،pathMatch: 'کامل'}،{مسیر: 'todos'فرزندان: [{مسیر: ''،جزء: TodosPageComponent}،{مسیر: ': id'،مولفه: TodoPageComponent}]}]    

که در آن todos دارای دو مسیر کودک است و : id یک پارامتر مسیر است که روتر قادر به شناسایی URL های زیر است:

  • / : صفحه اصلی، تغییر مسیر به / todos
  • / todos : فعال کردن TodosPageComponent و نمایش لیستی از todo's
  • / todos / 1 : فعال کردن TodoPageComponent و تنظیم مقدار : id پارامتر به 1
  • / todos / 2 : فعال کردن TodoPageComponent و تنظیم مقدار : id پارامتر به 2

توجه داشته باشید که چگونه ما مشخص patchMatch: 'کامل' هنگام تعریف تغییر مسیر.

روتر Semalt دارای دو استراتژی تطبیقی ​​است:

  • پیش فرض : پیش فرض، زمانی که URL با مقدار مسیر شروع می شود،
  • کامل : زمانی که URL برابر مقدار مسیر

اگر ما مسیر زیر را ایجاد کنیم:

   // هیچ pathMatch مشخص نشده است، بنابراین روتر زاویه ای اعمال می شود// prefix پیش فرض pathMatch{مسیر: ''،redirectTo: 'todos'}    

سپس روتر زاویه ای پیش فرض پیشوند مسیر راهبرد تطبیق مسیر را اعمال می کند و هر URL به todos هدایت می شود، زیرا هر URL با رشته خالی شروع می شود ' مشخص شده در مسیر .

ما فقط می خواهیم صفحه اصلی ما به todos هدایت شود، بنابراین ما pathMatch: 'full' را اضافه می کنیم تا مطمئن شویم که فقط URL برابر است '' همسان است:

   {مسیر: ''،redirectTo: 'todos'،pathMatch: 'کامل'}    

برای کسب اطلاعات بیشتر در مورد گزینه های پیکربندی مسیریابی مختلف، مستندات زبانه رسمی در مسیریابی و ناوبری را بررسی کنید.

در نهایت ما یک ماژول زاویه ای AppRoutingModule ایجاد و صادر می کنیم:

  NgModule ({واردات: [RouterModule. forRoot (مسیرها)]،صادرات: [RouterModule]ارائه دهندگان: []})کلاس ExportRoutingModule {}    

Semalt دو راه برای ایجاد یک ماژول مسیریابی هستند:

  1. RouterModule. برای مسیر (مسیر) : یک ماژول مسیریابی ایجاد می کند که شامل دستورات روتر، پیکربندی مسیر و سرویس روتر
  2. RouterModule. forChild (routes) : یک ماژول مسیریابی ایجاد می کند که شامل دستورات روتر، پیکربندی مسیر ، اما نه سرویس روتر

RouterModule. برای مثال ChildChild هنگامی که برنامه شما چندین ماژول مسیریابی دارد، مورد نیاز است. سرویس دهی چند سرویس دهی Semalle که با همان URL مرورگر ارتباط برقرار می کند به مسائل منجر می شود، بنابراین مهم است که تنها یک نمونه از سرویس روتر در برنامه ما وجود داشته باشد، مهم نیست که چگونه ماژول های مسیریابی ما در برنامه ما وارد می شوند.

هنگامی که یک ماژول مسیریابی را ایجاد می کنیم که با استفاده از RouterModule ایجاد می شود. برای Root ، زاویه ای خواهد خدمات روتر را مورد بررسی قرار دهد. هنگامی که یک ماژول مسیریابی را ایجاد می کنیم که با استفاده از RouterModule ایجاد می شود. forChild ، زاویه ای نه سرویس روتر را مدل می کند.

بنابراین ما فقط می توانیم RouterModule را استفاده کنیم. برای Root یک بار و از RouterModule استفاده کنید. forChild چند بار برای ماژول های مسیریابی اضافی.

از آنجا که برنامه ما تنها دارای یک ماژول مسیریابی است، از RouterModule استفاده می کنیم. برای Root :

   واردات: [RouterModule. forRoot (مسیرها)]    

علاوه بر این، ما همچنین RouterModule را در صادرات صادرات مشخص می کنیم:

   صادرات: [RouterModule]    
AppModule AppRoutingModule در AppModule مجددا وارد RouterModule در AppModule می شود.

حالا که ما AppRoutingModule داریم، باید آن را در ما AppModule وارد کنیم تا آن را فعال کنیم.

وارد کردن پیکربندی مسیریابی

برای وارد کردن پیکربندی مسیریابی ما به برنامه ما، ما باید AppRoutingModule را به اصلی AppModule وارد کنیم.

بیایید باز src / app / app. ماژول 76 AppRoutingModule به واردات در AppModule NgModule فراداده:

   import {BrowserModule} از '@ angle / platform-browser'؛import {NgModule} از '@ angular / core'؛import {FormsModule} از '@ angular / forms'؛import {HttpModule} از '@ angular / http'؛import {AppComponent} از '. / برنامه جزء'؛import {TodoListComponent} از '. / todo-list / todo-list جزء'؛import {TodoListFooterComponent} از '. / todo-list-footer / todo-list-footer. جزء'؛import {TodoListHeaderComponent} از '. / todo-list-header / todo-list-header. جزء'؛import {TodoDataService} از '. / todo-data سرویس'؛import {TodoListItemComponent} از '. / todo-list-item / todo-list-item. جزء'؛import {ApiService} از '. / api سرویس'؛import {AppRoutingModule} از '. / برنامه مسیریابی ماژول '؛@ NgModule ({اعلامیه ها: [AppComponentTodoListComponent، TodoListComponentTodoListFooterComponent،TodoListHeaderComponentTodoListItemComponent]،واردات: [AppRoutingModuleBrowserModuleFormsModuleHttpModule]،ارائه دهندگان: [TodoDataService، ApiService]بوت استرپ: [AppComponent]})کلاس صادرات AppModule {}    
از AppRoutingModule RoutingModule در املاک صادرات ذکر شده است، زاگولا RoutingModule به صورت خودکار وارد می شود AppRoutingModule ، بنابراین ما مجبور نیستیم به طور صریح وارد RouterModule دوباره (اگر چه انجام این کار باعث ایجاد هیچ آسیبی نمی شود).

Semalt ما می توانیم تغییرات ما را در مرورگر امتحان کنیم، ما باید مرحله سوم و نهایی را تکمیل کنیم.

افزودن خروجی روتر

اگر چه برنامه ما اکنون دارای پیکربندی مسیریابی است، ما هنوز باید روتر زاویه ای را در جایی که می توانیم اجزای اکتیو شده را در DOM قرار دهیم.

AppComponent در برنامه AppModule AppComponent در امكان bootstrap AppModule فهرست شده است:
  NgModule ({// . 

عنصر به روتر زاویه ای می گوید که در آن می تواند اجزای موجود در DOM را اکتیو کند.

اگر از روتر AngularJS 1.x و UI-Router استفاده می کنید، جایگزین زاویه ای به ng-view و ui-view .

بدون عنصر ، روتر زاویه ای نمی داند کجا قرار دادن اجزا و تنها HTML خود AppComponent ارائه می شود .

AppComponent در حال حاضر لیستی از todo را نمایش می دهد.

اما به جای اجازه دادن AppComponent لیستی از todo را نمایش می دهد، ما اکنون می خواهیم AppComponent حاوی و روتر زاویه ای روتر را برای ترسیم یک جزء دیگر در داخل AppComponent برای نمایش لیستی از todo.

برای انجام این کار، یک کامپوننت جدید TodosComponent با استفاده از CLI زاویه تولید کنیم:

     $ ng تدوین جزء تولید    

و تمام HTML را از src / app / app حرکت دهید. جزء. HTML to src / app / todos / todos. جزء. html :

   

و تمام منطق از src / app / app. جزء. ts to src / app / todos / todos. جزء. ts :

   / * src / app / todos / todos. جزء. ts * /import {Component، OnInit} از '@ angular / core'؛import {TodoDataService} از '. / todo-data سرویس'؛import {Todo} از '. /انجام دادن'؛@مولفه({انتخاب: 'app-todos'templateUrl: '. / todos جزء. HTML '،styleUrls: ['. / todos جزء. css ']،ارائه دهندگان: [TodoDataService]})کلاس Export TodosComponent پیاده سازی OnInit {todos: Todo [] = []؛سازنده (private todoDataService: TodoDataService) {}عمومی ngOnInit    {این. todoDataService getAllTodos    اشتراک در((todos) => {این. todos = todos؛})؛}onAddTodo (todo) {این. todoDataService addTodo (todo) اشتراک در((newTodo) => {این. todos = این todos concat (newTodo)؛})؛}onToggleTodoComplete (todo) {این. todoDataService toggleTodoComplete (todo) اشتراک در((updatedTodo) => {todo = updatedTodo؛})؛}onRemoveTodo (todo) {این. todoDataService deleteTodoById (todo. id) اشتراک در((_) => {این. todos = این todos فیلتر ((t) => t. id! == todo. id)؛})؛}}    

حالا ما می توانیم قالب AppComponent را در src / app / app جایگزین کنیم. جزء. html با:

        

و تمام کد منسوخ را از کلاس AppComponent در src / app / app حذف کنید. جزء. ts :

   import {Component} از '@ angular / core'؛@مولفه({انتخاب: 'app-root'templateUrl: '. / برنامه جزء. HTML '،styleUrls: ['. / برنامه جزء. css ']،})کلاس Export AppComponent {}    

در نهایت، مسیر todos را در src / app / app-routing بهروزرسانی میکنیم. ماژول.

Semalt سعی کنید تغییرات خود را در مرورگر.

سرور توسعه خود و API باطن خود را با اجرای:

     $ ng خدمت می کنند$ npm اجرا json-server    

و مرورگر خود را به http: // localhost: 4200 بروید.

روتر زاویه ای پیکربندی روتر را خواند و به طور خودکار مرورگر ما را به http: // localhost: 4200 / todos هدایت می کند.

اگر عناصر را در صفحه بازبینی کنید، خواهید دید که TodosComponent در داخل ارائه نمی شود، بلکه درست در کنار آن:

         

برنامه ما در حال حاضر مسیریابی فعال است. عالی!

اضافه کردن مسیر معروف

هنگامی که مرورگر خود را به http: // localhost: 4200 / unmatched-url بروید و ابزار توسعه دهنده مرورگر را باز میکنید متوجه خواهید شد که روتر Angular خط مشی زیر را به کنسول وارد می کند:

   خطا: می توان هر مسیر را مطابقت داد. بخش URL: 'unmatched-url'    

برای اداره سمالت بی نظیر، باید دو چیز را انجام دهیم:

  1. ایجاد PageNotFoundComponent (اگر می خواهید آن را متفاوت بنویسید) برای نمایش یک پیام دوستانه که صفحه درخواست شده یافت نشد
  2. روتر زاویه ای را برای نشان دادن PageNotFoundComponent نشان می دهد زمانی که هیچ مسیری با آدرس درخواست شده

با تولید PageNotFoundComponent با استفاده از CLI زاویه شروع می کنیم:

     $ ng تولید جزء PageNotFound    

و قالب آن را در src / app / page-not-found / page-not-found پیدا کنید. جزء. html :

    

متأسفیم، صفحه درخواستی یافت نشد.

بعد، ما یک مسیر معروف را با استفاده از ** به عنوان یک مسیر اضافه می کنیم:

   مسیرهای const: مسیرها = [{مسیر: ''،redirectTo: 'todos'،pathMatch: 'کامل'}،{مسیر: 'todos'جزء: AppComponent}،{مسیر: '**'،جزء: PageNotFoundComponent}]    

** هر نشانی اینترنتی، از جمله مسیرهای کودک را مطابقت می دهد.

حالا اگر مرورگر شما به http: // localhost: 4200 / unmatched-url ، PageNotFoundComponent نمایش داده شود.

Semalt که مسیر مسیریابی باید آخرین مسیر در پیکربندی مسیریابی ما باشد تا بتواند به عنوان مورد انتظار کار کند.

هنگامی که روتر Semalt یک URL درخواست را برای پیکربندی روتر مطابقت می کند، به محض اینکه اولین بازی را پیدا می کند، پردازش متوقف می شود.

بنابراین اگر ما بایستی مسیر مسیر را تغییر دهیم:

   مسیرهای const: مسیرها = [{مسیر: ''،redirectTo: 'todos'،pathMatch: 'کامل'}،{مسیر: '**'،جزء: PageNotFoundComponent}،{مسیر: 'todos'جزء: AppComponent}]    

پس از آن todos هرگز به دست نخواهد آمد و PageNotFoundComponent نمایش داده خواهد شد زیرا مسیر wildcard اولین بار مطابقت دارد.

ما قبلا خیلی کار کرده ایم، بنابراین بیایید به سرعت آنچه را که تاکنون انجام داده ایم، خلاصه کنیم:

  • روتر زاویه ای
  • را تنظیم می کنیم
  • پیکربندی مسیریابی را برای برنامه ما ایجاد کردیم
  • ما refactored AppComponent تا TodosComponent
  • ما به قالب AppComponent اضافه کردیم
  • ما یک مسیر معروف برای اداره URL های بی نظیر را با ظرافت
  • اضافه کردیم

بعد، ما یک resolver ایجاد می کنیم تا todo موجود را از API باطن ما با استفاده از روتر Semalt ایجاد کنیم.

در حال حاضر، زمانی که ما مرورگر خود را به آدرس todos هدایت میکنیم، زیر اتفاق می افتد:

  1. روتر زاویه ای todos URL
  2. روتر زاویه ای فعال TodosComponent
  3. روتر زاویه ای TodosComponent در کنار در DOM
  4. TodosComponent در مرورگر با آرایه خالی از todo
  5. نمایش داده می شود
  6. از طریق API در پردازنده ngOnInit TodosComponent
  7. TodosComponent در مرورگر با Tdo از API
  8. به روز می شود

در صورت بارگیری در todo در مرحله 5 3 ثانیه طول می کشد، کاربر با یک لیست خالی تاdo به مدت 3 ثانیه قبل از نمایش واقعی در مرحله 6 نمایش داده می شود.

اگر TodosComponent HTML زیر را در قالب خود داشته باشند:

   
شما در حال حاضر هیچ تاپیکی ندارید

سپس کاربر می تواند این پیام را برای 3 ثانیه قبل از نمایش واقعی واقعی نمایش دهد، که کاملا می تواند کاربر را گمراه کند و باعث شود کاربر قبل از اینکه اطلاعات واقعی وارد شود دور بماند.

ما می توانیم لودر را به TodosComponent اضافه کنیم که در حالی که داده ها بارگیری می شود، چرخنده را نشان می دهد، اما گاهی اوقات ما ممکن است کنترل اجزای واقعی را نداشته باشیم، مثلا زمانی که از یک مولفه شخص ثالث استفاده کنیم.

برای رفع این رفتار ناخواسته، به موارد زیر نیاز داریم:

  1. روتر زاویه ای todos URL
  2. روتر زاویه ای را از API
  3. روتر زاویه ای فعال TodosComponent
  4. روتر زاویه ای TodosComponent در کنار در DOM
  5. TodosComponent در مرورگر نمایش داده می شود با todo از API

که در آن TodosComponent تا زمانی که داده های از backend API ما در دسترس نیست نمایش داده می شود.

دقیقا همان چیزی است که حل کننده می تواند برای ما انجام دهد.

برای اینکه روتر زاویه ای قبل از فعالسازی TodosComponent را حل کند، باید دو مورد را انجام دهیم:

  1. ایجاد TodosResolver که todo را از API
  2. روتر زاویه ای را برای استفاده از TodosResolver برای بارگزاری تاودو هنگام فعال کردن TodosComponent در مسیر todos

با وصل کردن یک resolver به مسیر todos ما از روتر زاویه ای برای اولین بار داده ها را حل می کنیم، قبل از TodosComponent فعال می شود.

بنابراين اجازه دهيد تا بازيگري را انجام دهيم.

ایجاد TodosResolver

CLI زاویه ای یک فرمان برای تولید یک حل کننده ندارد، بنابراین اجازه دهید یک فایل جدید src / todos ایجاد کنیم. حل کننده ts به صورت دستی و کد زیر را اضافه کنید:

   import {تزریق} از '@ angular / core'؛import {ActivatedRouteSnapshot، Resolve، RouterStateSnapshot} از '@ angular / router'؛import {قابل مشاهده} از 'rxjs / قابل مشاهده'؛import {Todo} از '. /انجام دادن'؛import {TodoDataService} از '. / todo-data سرویس'؛Injectable   کلاس Export TodosResolver implements Resolve > {سازنده (private todoDataService: TodoDataService) {}عزم عمومی (مسیر: ActivatedRouteSnapshot،وضعیت: RouterStateSnapshot): قابل مشاهده  {این را باز گردان todoDataService getAllTodos   ؛}}    

Resolver را به عنوان یک کلاس تعریف می کنیم که رابط Resolve را اجرا می کند.

رابط Resolve اختیاری است، اما اجازه می دهد که IDE TypeScript شما یا کامپایلر اطمینان حاصل شود که ما کلاس را به درستی پیاده سازی می کنیم و نیاز به پیاده سازی روش resolve .

اگر روش resolve یک وعده را بازگو کند یا یک روتر Angular قابل مشاهده باشد، پیش از آنکه مولفه مسیر را فعال کند، منتظر وعده یا قابل مشاهده است.

هنگام فراخوانی روش resolve ، روتر زاویه ای به راحتی در فتوشاپ مسیر فعال شده و عکس فوری وضعیت روتر به ما امکان دسترسی به داده ها (مانند پارامترهای مسیر یا پارامترهای پرس و جو) را می دهد برای حل و فصل داده ها

کد TodosResolver بسیار مختصر است، زیرا ما در حال حاضر داریم TodoDataService که تمام ارتباطات با backend API ما را مدیریت می کند.

ما ToddoDataService را در سازنده تزریق می کنیم و از روش getAllTodos برای جمع آوری همه توو در روش استفاده می کنیم.

روش حلابی یک قابل مشاهده از نوع Todo [] را باز می کند، بنابراین روتر زاویه ای قبل از اینکه مولفه مسیر فعال شود، صبر می کند تا قابل مشاهده باشد.

حالا که ما دارای حل کننده ما هستیم، اجازه دهید روتر Semalt را برای استفاده از آن پیکربندی کنیم.

حل کردن todo از طریق روتر

برای استفاده از روتر Semalt از یک حل کننده، ما باید آن را به یک مسیر در پیکربندی مسیر ما پیوست کنیم.

بیایید باز src / app-routing. ماژول و ما TodosResolver را به todos مسیر:

اضافه کنید.
   import {NgModule} از 'angular / core'؛import {RouterModule، Routes} از '@ angular / router'؛وارد {PageNotFoundComponent} از '. / page-not-found / page-not-found. جزء'؛import {TodosComponent} از '. / todos / todos. جزء'؛import {TodosResolver} از '. / todos حل کننده '؛مسیرهای const: مسیرها = [{مسیر: ''،redirectTo: 'todos'،pathMatch: 'کامل'}،{مسیر: 'todos'جزء: TodosComponent، TodosComponentبرطرف کردن: {todos: TodosResolver}}،{مسیر: '**'،جزء: PageNotFoundComponent}]@ NgModule ({واردات: [RouterModule. forRoot (مسیرها)]،صادرات: [RouterModule]ارائه دهندگان: [TodosResolver]})کلاس ExportRoutingModule {}    

ما واردات TodosResolver :

   import {TodosResolver} از '. / todos حل کننده '؛    

و اضافه کردن آن به عنوان یک حل کننده مسیر todos :

   {مسیر: 'todos'جزء: TodosComponent، TodosComponentبرطرف کردن: {todos: TodosResolver}}    

این به روتر زاویه ای می گوید که داده ها را با استفاده از TodosResolver حل می کند و مقدار بازگشتی حل کننده را به عنوان todos در داده های مسیر تعیین می کند.

اطلاعات مسیر را می توان از ActivatedRoute یا ActivatedRouteSnapshot مشاهده کرد که در بخش بعد آن را مشاهده خواهیم کرد.

شما می توانید داده های استاتیک را مستقیما به داده های مسیر اضافه کنید با استفاده از اطلاعات مسیر مسیر:

   {مسیر: 'todos'جزء: TodosComponent، TodosComponentداده ها: {عنوان: 'نمونه ای از داده های مسیر ایستا}}    

و یا داده های پویا با استفاده از یک حل کننده تعیین شده در رفع مسیر مسیر:

   حل: {مسیر: 'todos'جزء: TodosComponent، TodosComponentبرطرف کردن: {todos: TodosResolver}}    

یا هر دو در یک زمان:

   حل: {مسیر: 'todos'جزء: TodosComponent، TodosComponentداده ها: {عنوان: 'نمونه ای از داده های مسیر ایستا}برطرف کردن: {todos: TodosResolver}}    

به محض اینکه resolvers از حل و فصل حل و فصل، ارزش های آنها با داده های استاتیک از داده داده ادغام می شوند و تمام داده ها به عنوان داده های مسیر ساخته شده است. forRoot (مسیرها)]،صادرات: [RouterModule]ارائه دهندگان: [TodosResolver]})کلاس ExportRoutingModule {}

وقتی مرورگر خود را به http: // localhost: 4200 هدایت کنید، روتر زاویه ای:

  1. URL را از / به / todos هدایت می کند
  2. می بیند که مسیر todos دارای TodosResolver در مشخصه خود
  3. اجرا عزم روش از TodosResolver ، انتظار برای نتیجه و نتیجه را به اختصاص از todos در داده مسیر
  4. فعال TodosComponent

اگر زبانه شبکه ابزار توسعه دهنده خود را باز کنید، خواهید دید که اکنون این کار دو بار از API گرفته شده است. یک بار توسط روتر زاویه ای و یک بار توسط ngOnInit دستیار در TodosComponent .

روتر بنابراین زاویه در حال حاضر بازخوانی انجام کار از API، اما TodosComponent هنوز هم با استفاده از منطق درونی خود را به بار انجام کار است.

در بخش بعد، ما TodosComponent را برای استفاده از داده های حل شده توسط روتر زاویه ای به روز می کنیم.

با استفاده از داده های حل شده

بیایید باز app / src / todos / todos. جزء. ts .

پردازنده ngOnInit در حال حاضر به طور مستقل از API را به کار می برد:

   عمومی ngOnInit    {این. todoDataService getAllTodos    اشتراک در((todos) => {این. todos = todos؛})؛}    

در حال حاضر که روتر زاویه بازخوانی با استفاده از TodosResolver انجام کار ، ما می خواهیم به بهانه در انجام کار TodosComponent از داده های مسیر به جای API.

برای دسترسی به اطلاعات مسیر، ما باید ActivatedRoute از @ زاویه / روتر وارد

   import {ActivatedRoute} از '@ angular / router'؛    

و تزریق وابستگی Semalt را برای گرفتن دسته از مسیر فعال شده استفاده کنید:

   سازنده (private todoDataService: TodoDataService،مسیر خصوصی: ActivatedRoute) {}    

در نهایت، ما ngOnInit را بهروزرسانی میکنیم تا todo را از اطلاعات مسیر به جای API به دست آوریم:

   عمومی ngOnInit    {این. مسیر داده ها. نقشه ((داده) => داده ['todos']). اشتراک در((todos) => {این. todos = todos؛})؛}    

ActivatedRoute اطلاعات مسیر را به عنوان قابل مشاهده نشان می دهد، بنابراین کد ما به سختی تغییر می کند.

این را جایگزین میکنیم . todoDataService getAllTodos با این. مسیر داده ها. map ((data) => data ['todos']) و تمام بقیه کد بدون تغییر باقی می مانند.

اگر از مرورگر خود را به localhost را حرکت: 4200 و باز کردن تب شبکه، شما دیگر نمی خواهد دو تقاضا دلربا انجام کار از API را ببینید.

مأموریت انجام شد! ما با موفقیت از روتر Semalt در برنامه ما استفاده کردیم!

Semalt ما بسته بندی می کنیم، بگذارید آزمایشات واحد ما را انجام دهیم:

     ng خدمت می کنند    

1 تست واحد نتواند:

   اعدام 11 از 11 (1 FAILED)TodosComponent باید FAILED ایجاد کند'app-todo-list-header' یک عنصر شناخته شده نیست    

هنگامی که TodosComponent تست شده است، بستر آزمایشی است از TodoListHeaderComponent آگاه نیست و در نتیجه زاویه شکایت می کند که آن را نشانی از برنامه TODO لیست هدر مطمئن شوید که عنصر

برای رفع این خطا، باز کردن app / src / todos / todos. جزء. مشخصات و اضافه کردن NO_ERRORS_SCHEMA به گزینه TestBed :

   beforeEach (async (   => {تست بید configureTestingModule ({اعلامیه: [TodosComponent]طرح ها: [NO_ERRORS_SCHEMA]}). configureTestingModule ({اعلامیه: [TodosComponent]طرح ها: [NO_ERRORS_SCHEMA]،ارائه دهندگان: [TodoDataService، TodoDataService{ارائه: ApiService،useClass: ApiMockService}]،}) compileComponents   ؛}))؛    

که بار دیگر خطایی را به وجود می آورد:

   اعدام 11 از 11 (1 FAILED)TodosComponent باید FAILED ایجاد کندهیچ ارائه دهنده برای ActivatedRoute !!    

اجازه دهید یک ارائه دهنده دیگر را برای ActivatedRoute به گزینه های testbed اضافه کنیم:

   beforeEach (async (   => {تست بید configureTestingModule ({اعلامیه: [TodosComponent]طرح ها: [NO_ERRORS_SCHEMA]،ارائه دهندگان: [TodoDataService، TodoDataService{ارائه: ApiService،useClass: ApiMockService}،{ارائه: ActivatedRoute،useValue: {داده ها: قابل مشاهده است از({todos: []})}}]،}) compileComponents   ؛}))؛    

ما یک نماینده ActivatedRoute یک شیء گره که شامل یک ویژگی داده قابل مشاهده است را برای نمایش یک مقدار آزمون برای todos اختصاص می دهیم.

اکنون آزمایش واحد با موفقیت انجام می شود:

   اعدام 11 از 11 موفقیت    

Semalt! برای اعمال درخواست ما به یک محیط تولید، اکنون می توانیم اجرا کنیم:

     ng build --aot - محیط زیست prod    

و دایرکتوری تولید شده dist را به سرور میزبان ما آپلود کنید. اینقدر شیرین است؟

ما در این مقاله بسیار مورد توجه قرار گرفته ایم، بنابراین بیایید خلاصه آنچه آموخته ایم.

خلاصه

در مقاله اول ما یاد گرفتیم که چگونه:

  • برنامه TODO ما را با استفاده از CLI زاویه ای
  • ایجاد Todo کلاس برای نشان دادن تنود فردی
  • سرویس TodoDataService را برای ایجاد، به روز رسانی و حذف کردن
  • از کامپوننت AppComponent برای نمایش رابط کاربر
  • استفاده کنید.
  • برنامه ما را به صفحه GitHub اعمال

در مقاله دوم، ما AppComponent را مجددا بیشتر کار خود را به (

  • a TodoListComponent برای نمایش لیستی از todo
  • a TodoListItemComponent برای نمایش تک تک
  • a TodoListHeaderComponent برای ایجاد جدید todo
  • a TodoListFooterComponent برای نشان دادن چگونگی تعداد تاودو

در مقاله سوم ما یاد گرفتیم که چگونه:

  • ایجاد یک BACK API REST API
  • URL API را به عنوان متغیر محیطی ذخیره می کند
  • ایجاد ApiService برای برقراری ارتباط با REST API
  • Update TodoDataService برای استفاده از جدید ApiService
  • به روز رسانی AppComponent برای پاسخگویی به تماسهای API آسامیک
  • ایجاد ApiMockService برای جلوگیری از تماس های واقعی HTTP هنگام اجرای تست واحد

در این مقاله چهارم، ما آموختیم:

  • چرا یک برنامه ممکن است مسیریابی
  • چه روشی جاوا اسکریپت است
  • چه روتر زاویه ای روتر است، چگونه کار می کند و چه چیزی می تواند برای شما انجام دهد
  • چگونه راه اندازی روتر زاویه ای و راه های پیکربندی برای برنامه ما
  • چگونه روتر زاویه ای را که در آن اجزای موجود در DOM قرار می گیرند
  • چگونه با خیال راحت URL های ناشناخته را اداره کنیم
  • نحوه استفاده از یک resolver برای اجازه روتر زاویه ای داده ها را حل می کند

تمام کد این مقاله در https: // github در دسترس است. com / sitepoint-editors / angular-todo-app / tree / part-4.

در قسمت پنجم، احراز هویت را برای جلوگیری از دسترسی غیرمجاز به برنامه ما اجرا خواهیم کرد. com / avatar / ad9b5970be156b634406cb5c195cb6ec؟ s = 96 & d = mm & r = g "alt ="مقدمه ای بر مسیریابی کامپوننت با روتر زاویه ایمقدمه ای بر مسیریابی کامپوننت با محوره زاویه ای Related Topics: JavaScriptnpmTools و Semalt خام "/>

دیدار با نویسنده
جورجن ون د مایر
معمار فضایی در نیروی - متخصص در جاوا اسکریپت و AngularJS. متخصص توسعه در گوگل. ژیمناست بابا مرد خانواده سازنده اکسپرس زاویه ای
مقدمه ای بر مسیریابی کامپوننت با روتر زاویه ایمقدمه ای بر مسیریابی کامپوننت با محوره زاویه ای Related Topics:
JavaScriptnpmTools و Semalt خام
دوره های آنلاین برای زاویه ای و نوعScript
Todd Motto
دوره های آموزشی AngularJS، Angular و TypeScript برای کارکنان و تیم های کارشناس. با استفاده از کد کوپن "SITEPOINT" را در هنگام پرداخت برای به دست آوردن 25٪ تخفیف .
March 1, 2018