Bu eğitim dersi, ayrıntılar sayfasını uygulamanıza nasıl bağlayacağınızı gösterir.
IMPORTANT: Yönlendirmeyi (routing) öğrenmek için yerel ortamınızı kullanmanızı öneriyoruz.
Neler öğreneceksiniz
Bu dersin sonunda uygulamanız, ayrıntılar sayfasına yönlendirme desteğine sahip olacaktır.
Rota parametreleri ile yönlendirmenin kavramsal önizlemesi
Her konut konumunun, kullanıcı o öğe için ayrıntılar sayfasına gittiğinde görüntülenmesi gereken belirli ayrıntıları vardır. Bu hedefe ulaşmak için rota parametrelerini kullanmanız gerekecektir.
Rota parametreleri, rota URL'nizin bir parçası olarak dinamik bilgi eklemenizi sağlar. Kullanıcının hangi konut konumuna tıkladığını belirlemek için HousingLocation türünün id özelliğini kullanacaksınız.
-
Dinamik navigasyon için
routerLinkkullanın- derste,
src/app/routes.tsdosyasına rota parametresini tanımlayan özel bir segment içeren ikinci bir rota eklediniz,id:
'details/:id'Bu durumda,
:iddinamiktir ve rotanın kod tarafından nasıl istendiğine bağlı olarak değişecektir.src/app/housing-location/housing-location.tsdosyasında,sectionöğesine bir anchor etiketi ekleyin verouterLinkyönergesini dahil edin:Add anchor with a routerLink directive to housing-location.ts
import {Component, input} from '@angular/core'; import {HousingLocationInfo} from '../housinglocation'; import {RouterLink} from '@angular/router'; @Component({ selector: 'app-housing-location', imports: [RouterLink], template: ` <section class="listing"> <img class="listing-photo" [src]="housingLocation.photo" alt="Exterior photo of {{ housingLocation().name }}" crossorigin /> <h2 class="listing-heading">{{ housingLocation().name }}</h2> <p class="listing-location">{{ housingLocation().city }}, {{ housingLocation().state }}</p> <a [routerLink]="['/details', housingLocation().id]">Learn More</a> </section> `, styleUrls: ['./housing-location.css'], }) export class HousingLocation { housingLocation = input.required<HousingLocationInfo>(); }routerLinkyönergesi, Angular'ın router'ının uygulamada dinamik bağlantılar oluşturmasını sağlar.routerLink'e atanan değer, iki girişli bir dizidir: yolun statik kısmı ve dinamik veri.routerLink'in şablonda çalışması için, '@angular/router' paketindenRouterLinkveRouterOutlet'in dosya düzeyinde import'unu ekleyin, ardından bileşeninimportsdizisini hemRouterLinkhem deRouterOutlet'i içerecek şekilde güncelleyin.Bu noktada, uygulamanızda yönlendirmenin çalıştığını doğrulayabilirsiniz. Tarayıcıda, ana sayfayı yenileyin ve bir konut konumu için "Learn More" düğmesine tıklayın.

- derste,
-
Rota parametrelerini alın
Bu adımda,
Detailsbileşeninde rota parametresini alacaksınız. Şu anda uygulamadetails works!görüntülüyor. Ardından, rota parametreleri kullanılarak aktarılaniddeğerini görüntülemek için kodu güncelleyeceksiniz.src/app/details/details.tsdosyasında,Detailsbileşeninde kullanacağınız fonksiyonları, sınıfları ve servisleri içe aktarmak için şablonu güncelleyin:Update file level imports
import {Component, inject} from '@angular/core'; import {ActivatedRoute} from '@angular/router'; import {HousingService} from '../housing.service'; import {HousingLocationInfo} from '../housinglocation'; @Component({ selector: 'app-details', template: ` <article> <img class="listing-photo" [src]="housingLocation?.photo" alt="Exterior photo of {{ housingLocation?.name }}" crossorigin /> <section class="listing-description"> <h2 class="listing-heading">{{ housingLocation?.name }}</h2> <p class="listing-location">{{ housingLocation?.city }}, {{ housingLocation?.state }}</p> </section> <section class="listing-features"> <h2 class="section-heading">About this housing location</h2> <ul> <li>Units available: {{ housingLocation?.availableUnits }}</li> <li>Does this location have wifi: {{ housingLocation?.wifi }}</li> <li>Does this location have laundry: {{ housingLocation?.laundry }}</li> </ul> </section> </article> `, styleUrls: ['./details.css'], }) export class Details { route: ActivatedRoute = inject(ActivatedRoute); housingService = inject(HousingService); housingLocation: HousingLocationInfo | undefined; constructor() { const housingLocationId = Number(this.route.snapshot.params['id']); this.housingLocation = this.housingService.getHousingLocationById(housingLocationId); } }housingLocationIddeğerini görüntülemek için@Componentdekoratörününtemplateözelliğini güncelleyin:template: `<p>details works! {{ housingLocationId }}</p>`,Detailssınıfının gövdesini aşağıdaki kodla güncelleyin:export class Details { route: ActivatedRoute = inject(ActivatedRoute); housingLocationId = -1; constructor() { this.housingLocationId = Number(this.route.snapshot.params['id']); } }Bu kod,
Detailsbileşenine geçerli rota hakkındaki verilere erişmenizi sağlayanActivatedRouterouter özelliğine erişim verir.constructoriçinde, kod rotadan alınanidparametresini bir dizeden sayıya dönüştürür.Tüm değişiklikleri kaydedin.
Tarayıcıda, konut konumlarından birinin "Learn More" bağlantısına tıklayın ve sayfada görüntülenen sayısal değerin, verilerdeki o konumun
idözelliğiyle eşleştiğini doğrulayın.
-
Detailsbileşenini özelleştirinArtık yönlendirme uygulamada düzgün çalıştığına göre,
Detailsşablonunu rota parametresi tarafından temsil edilen konut konumunun belirli verilerini görüntüleyecek şekilde güncellemek için harika bir zaman.Verilere erişmek için
HousingService'e bir çağrı ekleyeceksiniz.Şablon kodunu aşağıdaki kodla eşleşecek şekilde güncelleyin:
Update the Details template in src/app/details/details.ts
import {Component, inject} from '@angular/core'; import {ActivatedRoute} from '@angular/router'; import {HousingService} from '../housing.service'; import {HousingLocationInfo} from '../housinglocation'; @Component({ selector: 'app-details', template: ` <article> <img class="listing-photo" [src]="housingLocation?.photo" alt="Exterior photo of {{ housingLocation?.name }}" crossorigin /> <section class="listing-description"> <h2 class="listing-heading">{{ housingLocation?.name }}</h2> <p class="listing-location">{{ housingLocation?.city }}, {{ housingLocation?.state }}</p> </section> <section class="listing-features"> <h2 class="section-heading">About this housing location</h2> <ul> <li>Units available: {{ housingLocation?.availableUnits }}</li> <li>Does this location have wifi: {{ housingLocation?.wifi }}</li> <li>Does this location have laundry: {{ housingLocation?.laundry }}</li> </ul> </section> </article> `, styleUrls: ['./details.css'], }) export class Details { route: ActivatedRoute = inject(ActivatedRoute); housingService = inject(HousingService); housingLocation: HousingLocationInfo | undefined; constructor() { const housingLocationId = Number(this.route.snapshot.params['id']); this.housingLocation = this.housingService.getHousingLocationById(housingLocationId); } }housingLocationözelliklerine isteğe bağlı zincirleme operatörü?ile erişildiğine dikkat edin. Bu,housingLocationdeğeri null veya undefined ise uygulamanın çökmemesini sağlar.Detailssınıfının gövdesini aşağıdaki kodla eşleşecek şekilde güncelleyin:Update the Details class in src/app/details/details.ts
import {Component, inject} from '@angular/core'; import {ActivatedRoute} from '@angular/router'; import {HousingService} from '../housing.service'; import {HousingLocationInfo} from '../housinglocation'; @Component({ selector: 'app-details', template: ` <article> <img class="listing-photo" [src]="housingLocation?.photo" alt="Exterior photo of {{ housingLocation?.name }}" crossorigin /> <section class="listing-description"> <h2 class="listing-heading">{{ housingLocation?.name }}</h2> <p class="listing-location">{{ housingLocation?.city }}, {{ housingLocation?.state }}</p> </section> <section class="listing-features"> <h2 class="section-heading">About this housing location</h2> <ul> <li>Units available: {{ housingLocation?.availableUnits }}</li> <li>Does this location have wifi: {{ housingLocation?.wifi }}</li> <li>Does this location have laundry: {{ housingLocation?.laundry }}</li> </ul> </section> </article> `, styleUrls: ['./details.css'], }) export class Details { route: ActivatedRoute = inject(ActivatedRoute); housingService = inject(HousingService); housingLocation: HousingLocationInfo | undefined; constructor() { const housingLocationId = Number(this.route.snapshot.params['id']); this.housingLocation = this.housingService.getHousingLocationById(housingLocationId); } }Artık bileşen, seçilen konut konumuna göre doğru bilgileri görüntülemek için gereken koda sahiptir.
constructorartık rota parametresinigetHousingLocationByIdservis fonksiyonuna argüman olarak aktarmak içinHousingService'e bir çağrı içermektedir.Aşağıdaki stilleri
src/app/details/details.cssdosyasına kopyalayın:Add styles for the Details
.listing-photo { height: 600px; width: 50%; object-fit: cover; border-radius: 30px; float: right; } .listing-heading { font-size: 48pt; font-weight: bold; margin-bottom: 15px; } .listing-location::before { content: url('/public/location-pin.svg') / ''; } .listing-location { font-size: 24pt; margin-bottom: 15px; } .listing-features > .section-heading { color: var(--secondary-color); font-size: 24pt; margin-bottom: 15px; } .listing-features { margin-bottom: 20px; } .listing-features li { font-size: 14pt; } li { list-style-type: none; } .listing-apply .section-heading { font-size: 18pt; margin-bottom: 15px; } label, input { display: block; } label { color: var(--secondary-color); font-weight: bold; text-transform: uppercase; font-size: 12pt; } input { font-size: 16pt; margin-bottom: 15px; padding: 10px; width: 400px; border-top: none; border-right: none; border-left: none; border-bottom: solid 0.3px; } @media (max-width: 1024px) { .listing-photo { width: 100%; height: 400px; } }ve değişikliklerinizi kaydedin
Detailsbileşeninde, az önce oluşturulandetails.cssdosyasını stillerin kaynağı olarak kullanın:Update details.ts to use the created css file
import {Component, inject} from '@angular/core'; import {ActivatedRoute} from '@angular/router'; import {HousingService} from '../housing.service'; import {HousingLocationInfo} from '../housinglocation'; @Component({ selector: 'app-details', template: ` <article> <img class="listing-photo" [src]="housingLocation?.photo" alt="Exterior photo of {{ housingLocation?.name }}" crossorigin /> <section class="listing-description"> <h2 class="listing-heading">{{ housingLocation?.name }}</h2> <p class="listing-location">{{ housingLocation?.city }}, {{ housingLocation?.state }}</p> </section> <section class="listing-features"> <h2 class="section-heading">About this housing location</h2> <ul> <li>Units available: {{ housingLocation?.availableUnits }}</li> <li>Does this location have wifi: {{ housingLocation?.wifi }}</li> <li>Does this location have laundry: {{ housingLocation?.laundry }}</li> </ul> </section> </article> `, styleUrls: ['./details.css'], }) export class Details { route: ActivatedRoute = inject(ActivatedRoute); housingService = inject(HousingService); housingLocation: HousingLocationInfo | undefined; constructor() { const housingLocationId = Number(this.route.snapshot.params['id']); this.housingLocation = this.housingService.getHousingLocationById(housingLocationId); } }Tarayıcıda sayfayı yenileyin ve belirli bir konut konumu için "Learn More" bağlantısına tıkladığınızda, ayrıntılar sayfasının seçilen öğenin verilerine göre doğru bilgileri görüntülediğini doğrulayın.
-
Homebileşeninde navigasyonu kontrol edinÖnceki bir derste,
Appşablonunu birrouterLinkiçerecek şekilde güncellediniz. Bu kodu eklemek, logoya her tıklandığındaHomebileşenine geri navigasyon yapılmasını sağlamak için uygulamanızı güncelledi.Kodunuzun aşağıdakiyle eşleştiğini doğrulayın:
Confirm the routerLink in app.ts
import {Component} from '@angular/core'; import {Home} from './home/home'; import {RouterLink, RouterOutlet} from '@angular/router'; @Component({ selector: 'app-root', imports: [Home, RouterLink, RouterOutlet], template: ` <main> <a [routerLink]="['/']"> <header class="brand-name"> <img class="brand-logo" src="/public/logo.svg" alt="logo" aria-hidden="true" /> </header> </a> <section class="content"> <router-outlet /> </section> </main> `, styleUrls: ['./app.css'], }) export class App { title = 'homes'; }Kodunuz zaten güncel olmalı ama emin olmak için doğrulayın.
SUMMARY: Bu derste, ayrıntı sayfalarını göstermek için yönlendirme eklediniz.
Artık şunları biliyorsunuz:
- bir rotaya veri aktarmak için rota parametrelerini kullanma
- bir rota oluşturmak için dinamik veri kullanmak üzere
routerLinkyönergesini kullanma HousingService'ten belirli konut konumu bilgilerini görüntülemek için rota parametresi kullanma.
Şimdiye kadar gerçekten harika iş çıkardınız.
Bu derste ele alınan konular hakkında daha fazla bilgi için: