Angular'da 'yol eşleşmesi: tam' nedir ve nasıl bir etkiye sahiptir?


106

Burada tam olarak pathmatch kullanılıyor ve bu pathmatch'i sildiğimde uygulamayı yüklemiyor veya projeyi çalıştırmıyor bile

import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { HttpModule } from '@angular/http';
import { RouterModule } from '@angular/router';

import { AppComponent }  from './app.component';
import { WelcomeComponent } from './home/welcome.component';

/* Feature Modules */
import { ProductModule } from './products/product.module';

@NgModule({
  imports: [
    BrowserModule,
    HttpModule,
    RouterModule.forRoot([
      { path: 'welcome', component: WelcomeComponent },
      { path: '', redirectTo: 'welcome', pathMatch: 'full' },
      { path: '**', redirectTo: 'welcome', pathMatch: 'full' }
    ]),
    ProductModule
  ],
  declarations: [
    AppComponent,
    WelcomeComponent
  ],
  bootstrap: [ AppComponent ]
})
export class AppModule { }

Yanıtlar:


117
RouterModule.forRoot([
      { path: 'welcome', component: WelcomeComponent },
      { path: '', redirectTo: 'welcome', pathMatch: 'full' },
      { path: '**', component: 'pageNotFoundComponent' }
    ])

Durum 1 pathMatch:'full' : Bu durumda, uygulama localhost:4200(veya bazı sunucularda) başlatıldığında varsayılan sayfa karşılama ekranı olacaktır, çünkü urlhttps://localhost:4200/

Eğer https://localhost:4200/gibberishbu yönlendirme yapacağı pageNotFound çünkü ekranında path:'**'joker

Durum 2 pathMatch:'prefix' :

Rotalar varsa { path: '', redirectTo: 'welcome', pathMatch: 'prefix' }, artık bu hiçbir zaman joker karakter yoluna ulaşmayacaktır çünkü her url path:''tanımlanmış olarak eşleşecektir .


merhaba, bu örnek için net açıklama için teşekkür ederim, ancak tamamen açıklığa kavuşturmak için başka bir rota türü ile başka bir örnek verebilir misiniz lütfen? (çocuk rotaları vb. ile bir örnek kullanmak gibi). teşekkürler
sohaieb

gerçekten güzel bir açıklama efendim ama bana 2 farklı düzen ile nasıl yapılandıracağımı söyleyebilir misiniz. iç düzen ve dış düzen gibi>
Kapil soni

88

pathMatch = 'full' URL eşleşmesinin kalan, eşleşmeyen segmentleri önek yolu olduğunda bir yol isabeti ile sonuçlanır

pathMatch = 'prefix'yönlendiriciye, kalan URL , yeniden yönlendirme yolunun önek yolu ile başladığında yeniden yönlendirme yolunu eşleştirmesini söyler .

Referans: https://angular.io/guide/router#set-up-redirects

pathMatch: 'full' tüm URL yolunun eşleşmesi gerektiği ve rota eşleştirme algoritması tarafından tüketildiği anlamına gelir.

pathMatch: 'prefix' bu, yolun URL'nin başlangıcıyla eşleştiği ilk yolun seçildiği anlamına gelir, ancak daha sonra yol eşleştirme algoritması, URL'nin geri kalanının eşleştiği yerde eşleşen alt yolları aramaya devam eder.


36

Teknik olarak doğru olsa da, diğer yanıtlar Angular'ın URL'den rota eşleşmesinin bir açıklamasından faydalanacaktır. pathMatch: fullYönlendiricinin ilk etapta nasıl çalıştığını bilmiyorsanız tam olarak (kelime oyununu affedin) anlayabileceğinizi sanmıyorum.


Önce birkaç temel şeyi tanımlayalım. Biz örnek olarak bu URL'yi kullanırız: /users/james/articles?from=134#section.

  1. Açık olabilir, ancak önce sorgu parametrelerinin ( ?from=134) ve parçaların ( #section) yol eşleşmesinde herhangi bir rol oynamadığını belirtelim . Yalnızca temel url ( /users/james/articles) önemlidir.

  2. Açısal, URL'leri segmentlere ayırır . Segmentleri /users/james/articleselbette users, jamesve articles.

  3. Yönlendirici yapılandırması, tek bir kök düğümü olan bir ağaç yapısıdır. Her Routenesne, childrensırayla başka childrenveya yaprak düğümlere sahip olabilen düğümlere sahip olabilen bir düğümdür .

Yönlendiricinin amacı , kök düğümden başlayarak URL'nin tüm (!!!) segmentleriyle tam olarak eşleşecek bir yönlendirici yapılandırma dalı bulmaktır . Bu çok önemli! Angular, tüm URL ile eşleşebilecek bir yol yapılandırma dalı bulmazsa - ne fazla ne de az - hiçbir şey oluşturmayacaktır .

Örneğin, hedef URL'niz, /a/b/cancak yönlendirici yalnızca /a/bveya ile eşleşebiliyorsa /a/b/c/d, eşleşme yoktur ve uygulama hiçbir şey oluşturmayacaktır.

Son olarak, rotalar normal rotalardan biraz farklı redirectTodavranıyor ve bana öyle geliyor ki, herkesin gerçekten kullanmak isteyeceği tek yer bunlar . Ama buna daha sonra değineceğiz.pathMatch: full

Varsayılan ( prefix) yol eşleşmesi

Adın arkasındaki mantık prefix, böyle bir yol yapılandırmasının, yapılandırılanın pathkalan URL segmentlerinin bir öneki olup olmadığını kontrol etmesidir. Bununla birlikte, yönlendirici yalnızca tam segmentlerle eşleşebilir , bu da bu adlandırmayı biraz kafa karıştırıcı hale getirir.

Her neyse, diyelim ki bu bizim kök seviyesinde yönlendirici yapılandırmamız:

const routes: Routes = [
  {
    path: 'products',
    children: [
      {
        path: ':productID',
        component: ProductComponent,
      },
    ],
  },
  {
    path: ':other',
    children: [
      {
        path: 'tricks',
        component: TricksComponent,
      },
    ],
  },
  {
    path: 'user',
    component: UsersonComponent,
  },
  {
    path: 'users',
    children: [
      {
        path: 'permissions',
        component: UsersPermissionsComponent,
      },
      {
        path: ':userID',
        children: [
          {
            path: 'comments',
            component: UserCommentsComponent,
          },
          {
            path: 'articles',
            component: UserArticlesComponent,
          },
        ],
      },
    ],
  },
];

RouteBuradaki her bir nesnenin varsayılan eşleştirme stratejisini kullandığını unutmayın prefix. Bu strateji, yönlendiricinin tüm yapılandırma ağacını yinelediği ve URL tam olarak eşleşene kadar bunu hedef URL segmentiyle segment bazında eşleştirmeye çalıştığı anlamına gelir . Bu örnek için şu şekilde yapılacaktır:

  1. İlk URL segmenti ile tam bir eşleşme bulmak için kök diziyi yineleyin - users.
  2. 'products' !== 'users', bu yüzden o dalı atlayın. Bir .startsWith()veya .includes()- yerine bir eşitlik kontrolü kullandığımızı unutmayın - yalnızca tam segment eşleşmeleri sayılır!
  3. :otherherhangi bir değerle eşleşir, bu nedenle bir eşleşme olur. Ancak, hedef URL henüz tam (hala eşleşmesi gerekir eşleşmeyen jamesve articlesçocuklar için böylece yönlendirici görünüyor).
  • Tek çocuğu :otherDİR tricksolduğunu !== 'james'dolayısıyla bir maç değil.
  1. Angular daha sonra kök diziye geri döner ve oradan devam eder.
  2. 'user' !== 'users, dalı atla.
  3. 'users' === 'users- segment eşleşiyor. Ancak, bu henüz tam bir eşleşme değil, bu nedenle çocukları aramalıyız (3. adımda olduğu gibi).
  • 'permissions' !== 'james', Bunu atlayın.
  • :userIDherhangi bir şeyle eşleşir, dolayısıyla jamessegment için bir eşleşmemiz olur . Ancak bu yine de tam bir eşleşme değil, bu nedenle eşleşecek bir çocuk aramamız gerekiyor articles.
    1. Bunun bize tam bir eşleşme sağlayan :userIDbir çocuk rotası olduğunu görebiliyoruz articles! Böylece uygulama ortaya çıkar UserArticlesComponent.

Tam URL ( full) eşleşiyor

örnek 1

Şimdi usersrota yapılandırma nesnesinin şöyle göründüğünü hayal edin :

{
  path: 'users',
  component: UsersComponent,
  pathMatch: 'full',
  children: [
    {
      path: 'permissions',
      component: UsersPermissionsComponent,
    },
    {
      path: ':userID',
      component: UserComponent,
      children: [
        {
          path: 'comments',
          component: UserCommentsComponent,
        },
        {
          path: 'articles',
          component: UserArticlesComponent,
        },
      ],
    },
  ],
}

Kullanımına dikkat edin pathMatch: full. Durum böyle olsaydı 1-5 arası adımlar aynı olurdu, ancak 6. adım farklı olurdu:

  1. 'users' !== 'users/james/articles- yol yapılandırması tam URL ile eşleşmediğinden segment eşleşmiyor , yani .userspathMatch: fullusers/james/articles
  2. Eşleşme olmadığı için bu şubeyi atlıyoruz.
  3. Bu noktada bir eşleşme bulamadan yönlendirici yapılandırmasının sonuna ulaştık. Uygulama hiçbir şey vermez .

Örnek 2

Ya bunun yerine şuna sahip olsaydık:

{
  path: 'users/:userID',
  component: UsersComponent,
  pathMatch: 'full',
  children: [
    {
      path: 'comments',
      component: UserCommentsComponent,
    },
    {
      path: 'articles',
      component: UserArticlesComponent,
    },
  ],
}

users/:userIDile pathMatch: fullmaçların sadece users/jamesböylece bir kez daha hayır-maç, ve uygulama hiçbir şey çıkarmaz.

Örnek 3

Şunu düşünelim:

{
  path: 'users',
  children: [
    {
      path: 'permissions',
      component: UsersPermissionsComponent,
    },
    {
      path: ':userID',
      component: UserComponent,
      pathMatch: 'full',
      children: [
        {
          path: 'comments',
          component: UserCommentsComponent,
        },
        {
          path: 'articles',
          component: UserArticlesComponent,
        },
      ],
    },
  ],
}

Bu durumda:

  1. 'users' === 'users- segment eşleşiyor, ancak james/articlesyine de eşleşmiyor . Çocuk arayalım.
  • 'permissions' !== 'james' - atla.
  • :userID'Sadece olacağını tek bir segment, eşleşebilir james. Ancak, bu bir pathMatch: fullyoldur ve eşleşmelidir james/articles(kalan URL'nin tamamı). Bunu yapamaz ve bu yüzden bir eşleşme değildir (bu yüzden bu dalı atlıyoruz)!
  1. Yine, URL için herhangi bir eşleşme bulamadık ve uygulama hiçbir şey vermiyor .

Fark etmiş olabileceğiniz gibi, bir pathMatch: fullkonfigürasyon temelde şunu söylüyor:

Çocuklarımı görmezden gelin ve sadece benimle eşleştirin. Kalan tüm URL segmentlerini kendim eşleştiremiyorsam , devam edin.

Yönlendirmeler

A Routetanımlayanlar redirectToaynı ilkelere göre hedef URL ile eşleştirilecektir. Buradaki tek fark , yönlendirmenin bir segment eşleşir eşleşmez uygulanmasıdır . Bu, bir yönlendirme yolu varsayılan prefixstratejiyi kullanıyorsa, yeniden yönlendirmeye neden olmak için kısmi eşleşme yeterli olduğu anlamına gelir . İşte güzel bir örnek:

const routes: Routes = [
  {
    path: 'not-found',
    component: NotFoundComponent,
  },
  {
    path: 'users',
    redirectTo: 'not-found',
  },
  {
    path: 'users/:userID',
    children: [
      {
        path: 'comments',
        component: UserCommentsComponent,
      },
      {
        path: 'articles',
        component: UserArticlesComponent,
      },
    ],
  },
];

İlk URL'miz ( /users/james/articles) için, şöyle olur:

  1. 'not-found' !== 'users' - Bunu atlayın.
  2. 'users' === 'users' - bir kibritimiz var.
  3. Bu maç bir var redirectTo: 'not-found'olan, hemen uygulanır .
  4. Hedef URL olarak değişir not-found.
  5. Yönlendirici tekrar eşleşmeye başlar ve not-foundhemen için bir eşleşme bulur . Uygulama oluşturulur NotFoundComponent.

Şimdi usersrotada şunlar da olsaydı ne olurdu bir düşünün pathMatch: full:

const routes: Routes = [
  {
    path: 'not-found',
    component: NotFoundComponent,
  },
  {
    path: 'users',
    pathMatch: 'full',
    redirectTo: 'not-found',
  },
  {
    path: 'users/:userID',
    children: [
      {
        path: 'comments',
        component: UserCommentsComponent,
      },
      {
        path: 'articles',
        component: UserArticlesComponent,
      },
    ],
  },
];
  1. 'not-found' !== 'users' - Bunu atlayın.
  2. usersURL'nin ilk segmentiyle eşleşir, ancak rota yapılandırması bir fulleşleşme gerektirir , bu nedenle atlayın.
  3. 'users/:userID'eşleşir users/james. articleshala eşleşmiyor ancak bu rotada çocuklar var.
  • articlesÇocuklarda bir eşleşme buluyoruz . Tüm URL artık eşleştirilir ve uygulama oluşturulur UserArticlesComponent.

Boş yol ( path: '')

Boş yol, biraz özel bir durumdur, çünkü herhangi bir segmenti "tüketmeden" eşleşebilir (bu nedenle, altlarının bu segmenti yeniden eşleştirmesi gerekir). Şu örneği düşünün:

const routes: Routes = [
  {
    path: '',
    children: [
      {
        path: 'users',
        component: BadUsersComponent,
      }
    ]
  },
  {
    path: 'users',
    component: GoodUsersComponent,
  },
];

Diyelim ki erişmeye çalışıyoruz /users:

  • path: ''her zaman eşleşir, dolayısıyla rota eşleşir. Ancak, URL'nin tamamı eşleşmedi - yine de eşleşmemiz gerekiyor users!
  • usersKalan (ve yalnızca!) Segmentle eşleşen bir çocuk olduğunu görebiliriz ve tam bir eşleşmemiz var. Uygulama oluşturulur BadUsersComponent.

Şimdi asıl soruya geri dönün

OP, bu yönlendirici yapılandırmasını kullandı:

const routes: Routes = [
  {
    path: 'welcome',
    component: WelcomeComponent,
  },
  {
    path: '',
    redirectTo: 'welcome',
    pathMatch: 'full',
  },
  {
    path: '**',
    redirectTo: 'welcome',
    pathMatch: 'full',
  },
];

Kök URL'ye ( /) gidersek , yönlendirici bunu şu şekilde çözecektir:

  1. welcome boş bir segmentle eşleşmiyor, bu yüzden atlayın.
  2. path: ''boş segmentle eşleşir. pathMatch: 'full'URL'nin tamamını eşleştirdiğimizden de tatmin olan bir a'ya sahiptir (tek bir boş segmenti vardı).
  3. Bir yönlendirme welcomegerçekleşir ve uygulama oluşturulur WelcomeComponent.

Ya hayır yoksa pathMatch: 'full'?

Aslında, her şeyin tamamen aynı şekilde davranması beklenir. Ancak, Angular açıkça böyle bir yapılandırmayı ( { path: '', redirectTo: 'welcome' }) engeller çünkü bunu Routeyukarıya koyarsanız welcome, teorik olarak sonsuz bir yeniden yönlendirme döngüsü oluşturur. Yani Angular sadece bir hata atar , bu yüzden uygulama hiç çalışmaz! ( https://angular.io/api/router/Route#pathMatch )

Aslında, bu bana pek mantıklı gelmiyor çünkü Angular , bu tür sonsuz yeniden yönlendirmelere karşı bir koruma da uyguladı - her yönlendirme düzeyi için yalnızca tek bir yönlendirme çalıştırıyor! Bu, diğer tüm yönlendirmeleri durdurur (aşağıdaki örnekte göreceğiniz gibi).

Peki ya path: '**'?

path: '**'maç olacak kesinlikle bir şey ( af/frewf/321532152/fsaya a olmaksızın bir maç)pathMatch: 'full' .

Ayrıca, her şeyle eşleştiği için { path: '', redirectTo: 'welcome' }, bu kurulumda tamamen gereksiz kılan kök yolu da dahil edilmiştir .

Yeterince tuhaf bir şekilde, bu konfigürasyona sahip olmak gayet iyi:

const routes: Routes = [
  {
    path: '**',
    redirectTo: 'welcome'
  },
  {
    path: 'welcome',
    component: WelcomeComponent,
  },
];

Gidersek /welcome, path: '**'bir eşleşme olacak ve hoş geldiniz için bir yönlendirme gerçekleşecek. Teorik olarak bu, sonsuz bir yeniden yönlendirme döngüsü başlatmalıdır, ancak Angular bunu hemen durdurur (daha önce bahsettiğim koruma nedeniyle) ve her şey yolunda gider.


Tam yol için biraz kafam karıştı. Tam URL eşleştirmesinin Örnek 3'ünde bahsetmiştiniz, Bahsettiğiniz Ignore my children and only match me. If I am not able to match all of the remaining URL segments myself, then move on. Yönlendirme bölümünün tam yol eşleştirmesinde olduğu gibi, We find a match for articles in the children. The whole URL is now matched and the application renders UserArticlesComponent.Anladığım kadarıyla Reidrect'te de eşleşmemelidir?
RNS

Kayıt için - ignore my childrenaçıklamayı kendim buldum. Şüphe, Angular geliştiricileri bunu böyle görüyor, ancak bu , ilkelerinden biridir pathMatch: 'full'. Dolayısıyla, atıfta bulunduğunuz yeniden yönlendirme örneğinde pathMath: 'full', ikinci rotaya ( path: 'users') uygulanan , bu nedenle uyuşmayan dikkat edin. Eşleşen rota, path: 'users/:userID'kullanılmayan pathMatch: 'full've her zamanki gibi çalışan rota . Yani önce eşleşir users/jamesve sonra articlesçocuklarında ararız (bir kez daha kullanmaz pathMatch: 'full').
Avius

3

Yol eşleştirme stratejisi, "önek" veya "tam" dan biri. Varsayılan 'önek'tir.

Varsayılan olarak yönlendirici, URL'nin belirli bir yolla eşleşip eşleşmediğini görmek için soldan URL öğelerini kontrol eder ve bir eşleşme olduğunda durur. Örneğin, '/ takım / 11 / kullanıcı', 'takım /: kimlik' ile eşleşir.

Yol eşleştirme stratejisi, URL'nin tamamına karşı "tam" eşleşir. Boş yol yollarını yeniden yönlendirirken bunu yapmak önemlidir. Aksi takdirde, boş bir yol herhangi bir URL'nin öneki olduğundan, yönlendirici yeniden yönlendirme hedefine giderken bile yönlendirmeyi uygulayarak sonsuz bir döngü oluşturur.

Kaynak: https://angular.io/api/router/Route#properties

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.