Angular Routing

Basic Routing

app.module.ts içine modul tanımlamalarından önce bu structure da bir route array’i tanımla ;


const appRoutes: Routes = [
  {
    path: '',
    component: HomeComponent
  },
  {
    path: 'servers',
    component: ServersComponent
  },
  {
    path: 'users',
    component: UsersComponent
  }
];

Ardından yine app.module.ts içindeki imports array’ine ;

RouterModule.forRoot(appRoutes) 

Routing Outlet#

<div class="row">
    <div class="col-xs-12 col-sm-10 col-md-8 col-sm-offset-1 col-md-offset-2">
      <router-outlet></router-outlet>
	</div>
</div>

Burada kullanılan <router-outlet></router-outlet> module de tanımladığımız route arrayinin içindeki path ve componentlerin nerede bind edileceğini angular’a anlatır. Yani angular route işlemini <router-outlet></router-outlet> bunu gördüğü yerde hangi component hangi route ile beraberse o componenti göstercek.

Ekle ki yukarda tanımlanan route verileri parse edilebilsin

Kullanmak istediğin route’ları aşağıdaki gibi component.html dosyasına koyabilirsin ;

<ul class="nav nav-tabs">
  <li role="presentation"><a [routerLink]="'/'">Home</a></li>
  <li role="presentation"><a [routerLink]="'/servers'">Servers</a></li>
  <li role="presentation"><a [routerLink]="'/users'">Users</a></li>
</ul>

Diyelim ki /servers linkine gittiğindeki componentin içinde de bir routing işlemi yapılacak. Bu durumda var olan linkin ‘localhost:4200/servers’ olacaktır. Bu durumda /servers içindeki routing aşağıdaki senaryolarda olabilir ;

<a [routerLink]="['/servers']">Reload Page</a>

Bu link ‘localhost:4200/servers’ olarak değerlendirlecek

<a [routerLink]="['servers']">Reload Page</a>

Bu link ‘localhost:4200/servers/servers’ olarak değerlendirlecek

Routing Programmatically

Diyelim ki bi buton veya event ile bir sayfadan diğer sayfaya route yapılacak. Bu esnada @angular/router dan gelen ‘Router’ classını kullan.#

import { Component, OnInit } from '@angular/core';
import {ActivatedRoute, Router} from '@angular/router';

@Component({
  selector: 'app-home',
  templateUrl: './home.component.html',
  styleUrls: ['./home.component.css']
})
export class HomeComponent implements OnInit {

  constructor(private router: Router) { }

  ngOnInit() {
  }

  onLoadServers() {
    this.router.navigate(['/servers']);
  }
}

Ancak bu örnekte router component.html de kullandığımız [routerLink] gibi mevcut linki bilmiyor. Mevcut linki belirtmek için @angular/route dan ActivatedRoute classını import etmeliyiz.

Activated Route

import { Component, OnInit } from '@angular/core';
import {ActivatedRoute, Router} from '@angular/router';

@Component({
  selector: 'app-home',
  templateUrl: './home.component.html',
  styleUrls: ['./home.component.css']
})
export class HomeComponent implements OnInit {

  constructor(private activatedRoute: ActivatedRoute,
              private router: Router) { }

  ngOnInit() {
  }

  onLoadServers() {
    this.router.navigate(['/servers'], {relativaTo: this.activatedRoute});
  }
}

Böylelikle bu sayfanın route ‘unu belirtiyoruz. Sonuç olarak [’/servers’] ‘mı yoksa [‘servers’] olarak mı kullanacağımız anlıyoruz.

Dynamic Route Link

const appRoutes: Routes = [
  {
    path: '',
    component: HomeComponent
  },
  {
    path: 'servers',
    component: ServersComponent
  },
  {
    path: 'users',
    component: UsersComponent
  },
  {
    path: 'users/:id',
    component: UserComponent
  }
];

En başta bildirdiğimiz arrayin sonuna eklediğimiz users/:id route ’ u aslında dinamic bir route oldu. localhost:4200/users/1 ya da localhost:4200/users/123123 gibi değişkene sahip route lar gönderebilmeye başladık.

Fetching Route Data#

localhost:4200/users/123123 123123 verisini nasıl alırım ?

Route ’lar aşağıdaki gibi değiştirildi

const appRoutes: Routes = [
  {
    path: 'users/:id/:name',
    component: UserComponent
  }
];
import {Component, OnInit} from '@angular/core';
import {ActivatedRoute, Params} from '@angular/router';

@Component({
  selector: 'app-user',
  templateUrl: './user.component.html',
  styleUrls: ['./user.component.css']
})
export class UserComponent implements OnInit {
  user: { id: number, name: string };

  constructor(private activatedRoute: ActivatedRoute) {
  }

  ngOnInit() {
    // Herhangi bir user model'i olmadığı için user objesini initialize etmek için var
    this.user = {
      id: this.activatedRoute.snapshot.params['id'],
      name: this.activatedRoute.snapshot.params['name']
    };
    //--------------------------------------------------------------------------------

    this.activatedRoute.params.subscribe(
      (params: Params) => {
        this.user.id = params['id'];
        this.user.name = params['name'];
      },
      () => {
      }
    );
  }
}

Subscribe durumu her durum için gerekli olmayabilir. Eğer bulunduğunuz sayfadan tekrar aynı sayfaya bi routing işlemi yapıyorsan subscribe kullanmak zorundasın. çünkü aynı sayfada olduğun için angular sadece route linkini değiştiriyor. bu route linki değişim işlemi asenkron bir iş olduğu için subscribe kullanmak zorundasın.

Route linkinde query param ve fragment eklenmesi localhost:4200/users?allowEdit=1#loading gibi linker bakılabilir.

Routing de child routing işlemlerine bakılabilir. Eğer tekrarlayan bir path durumu var ise.

Wildcard Route#

const appRoutes: Routes = [
  {
    path: '',
    component: HomeComponent
  },
  {
    path: 'servers',
    component: ServersComponent
  },
  {
    path: 'users',
    component: UsersComponent
  },
  {
    path: '**',
    component: HomeComponent
  }     
];

Yukarıda bulunan ** işareti wildcard dır. Belirtilmeyen diğer tüm route lar için HomeComponent yönlendirilir.

Atacan KULLABCI © 2024