Angular路由傳值的四種方式

傾家蕩產買入文乃股!!!文乃天外飛仙,唯我文乃(破嗓)!!


《我們無法一起學習》古橋文乃

任你們前十二集蹦來蹦去,我只打我的助攻,在最佳的時機,最佳的地點用最佳的方式開始絕地反殺,大招清場,五殺團滅,直接MVP到手。文乃同學的操作真是天秀666……這些都是因為巧合導致而不是文乃醬是腹黑。話說回來——天降系真是絕殺幼馴染啊。不過天降系不是最猛的,最猛的是天降幼馴!015小草莓你“死”的好慘啊!

開始學習吧!

開始正片吧,例如現在我們有兩個組件,一個是新聞列表list.component;另一個是新聞新聞詳情detail.component。根據組件的功能我們應該是從新聞列表頁面進入詳情頁面,根據列表中條目的文章ID請求數據調用詳細的文章信息然后展示給用戶查看。我們如何在列表頁把文章ID傳給詳情頁呢?

共有四種方式。確切說是分成兩大類共四小類,我給大類定義的名字是主動跳轉傳值觸發跳轉傳值,兩種方式都包含有get跳轉和動態路由兩種方式來實現,這樣也就就是四種了下面一一道來:

前提是我們在app-routing.module.ts中已經添加了相關的路由條目,嗯!我們先不考慮RouterModule.forRoot()RouterModule.forChild()的區別和應用場景,為了方便理解記憶路由傳值,在這里這里面我們把所有的路由信息都寫到了app-routing.module.ts

// 導入路由模塊及組件信息
import { Routes ,  RouterModule } from '@angular/router';
import { ListComponent } from '....';
import { DetailComponent } from '....';

// 定義路由信息
const routes: Routes = [
  {path: 'list', component: ListComponent},
  {path: 'detail', component: DetailComponent},
  {path: '**', redirectTo: 'home'},
];

// 應用路由
@NgModule({
  imports: [RouterModule.forRoot(routes)],
  exports: [RouterModule]
})

一,主動跳轉傳值

1:Get方式

newslist.component.html中使用ngfor調用列表,使用routerLink屬性來定義跳轉路由地址,使用queryParams屬性來定義要傳遞的值。注意值的形式,別搞錯了。不管是字符串還是變量都要有" "來包裹,而字符串還要再多一層' '

<!--  newslist.component.html  -->
<ul class="list">
    <li *ngFor="let item of items">
        <!--   使用queryParams屬性來傳遞值  -->
        <a [routerLink]="['/detail']" [queryParams]="{ id:item.ID }">{{item.title}}</a>
    </li>
</ul>

detail.component中使用ActivatedRoute模塊的queryParams方法來接受傳遞過來的數據,需要注意的queryParams是一個RXJS對象需要用subscribe訂閱來調用返回值。

/* detail.component.ts
 要先導入ActiveRoute模塊 */
import { ActivatedRoute } from "@angular/router"

// 構造函數中實例化
constructor( public route:ActivatedRoute ){ }

// 接收到傳遞過來的值
this.route.queryParams.subscribe( val:any => {
    console.log('文章ID:',val.id )
})

2:動態路由

部分代碼已經省略,可以比較前面的代碼。首先需要在路由文件中定義路由信息,這也是get方式和動態路由的區別之一,get方式不用設置路由信息,而動態路由顧名思義是需要設置路由信息的。

路由信息中添加動態路由:

// app-routing.module.ts
// 省略部分見開頭的代碼 注意形式是 '/:',別寫錯
  {path: 'detail/:id', component: ListComponent},

然后是路由跳轉,不使用queryParams屬性跳轉,而是routerLink屬性傳值的時候內部的數組中,這個第二項附帶上要傳的值(數組下標1)。

<!--  newslist.component.html  -->
    <a [routerLink]="['/detail' , item.id]">{{item.title}}</a>

最后接受發送的數據,這里還是使用ActivatedRoute模塊,但是不再使用queryParams方法,而是用params方法,而且params也是一個RXJS對象同樣還是要用subscribe訂閱來調用返回值。

// detail.component.ts
this.route.params.subscribe( val:any => {
    console.log('文章ID:',val )
})
//  * 注意前面傳來的值是對象還是字符串

二:觸發跳轉傳值

1:動態路由

前面所說的例子都是依附于html<a>標簽,言外之意就是需要用戶來點擊才能觸發路由跳轉,如果使用場景中不需要用戶點擊而是根據條件判斷結果自動跳轉,例如判斷用戶是否已經登錄,如果是自動登錄狀態就讓用戶自動跳轉到指定頁面,如果沒有就自動跳轉到登錄頁面。這個情況下使用angular的routerLink就會有點力不從心了。

這個時候我們就可以通過封裝JS跳轉的方法,在判斷條件滿足時,自動觸發該方法即可。既然是觸發跳轉的路由跳轉,那么肯定還是和我們的路由信息有關聯,還是在app-routing.module.ts中添加路由信息:

// app-routing.module.ts
// 省略部分見開頭的代碼 注意形式是 '/:',別寫錯
  {path: 'detail/:id', component: ListComponent},

我們使用Router模塊。注意這個地方別寫錯了。Routes是路由信息配置的類,ActivatedRoute模塊是接受傳來數據時用的模塊,RouterModule是路由模塊,Router模塊是JS路由跳轉用的模塊,有點亂……沒關系通過一個表格,有助于我們記憶。

“混亂的route”

// 引入Router 模塊
import { Router } from '@angular/router';

使用Routernavigate方法來進行跳轉,傳遞格式和動態路由一樣。

// 構造函數中實例化
constructor(private router: Router) {}

// 帶傳值的JS跳轉,注意傳值的方式,和動態路由一樣。
this.router.navigate(['/detail', item.id]);

// 沒有傳值的跳轉
this.router.navigate(['/home']);
}
}

2:get跳轉

這和get方式跳轉一樣,不需要路由信息的支持,直接傳遞就可以。不過我們需要額外引入一個NavigationExtras的類來定義傳遞的信息。

//引入NavigationExtras類
import { Router ,NavigationExtras} from '@angular/router';

定義傳參,get跳轉傳值:

let navigationExtras: NavigationExtras = {
    queryParams: { 'id': item.id },
    fragment: 'anchor'
};
this.router.navigate(['/detail'],navigationExtras);

后記:其實我覺得這篇文章叫路由跳轉方式比較貼切,嘿嘿……

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,283評論 6 530
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 97,947評論 3 413
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,094評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,485評論 1 308
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,268評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,817評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,906評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,039評論 0 285
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,551評論 1 331
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,502評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,662評論 1 366
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,188評論 5 356
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 43,907評論 3 345
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,304評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,563評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,255評論 3 389
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,637評論 2 370

推薦閱讀更多精彩內容

  • 路由是 Angular 應用程序的核心,它加載與所請求路由相關聯的組件,以及獲取特定路由的相關數據。這允許我們通過...
    semlinker閱讀 12,186評論 4 16
  • 一、SPA的概念 首先明確一個概念,SPA,全稱為Single Page Application單頁應用,一個單頁...
    耦耦閱讀 5,965評論 0 3
  • 官網鏈接: angular官網 路由與導航最好是跟著官網寫一遍代碼,然后來看這個總結,會比較清晰 如何實現一個簡單...
    H_DaYan閱讀 3,250評論 0 6
  • 路由要解決的核心問題是通過建立URL和頁面的對應關系,使得不同的頁面可以用不同的URL表示。在angular中,頁...
    oWSQo閱讀 1,298評論 0 1
  • Angular介紹 Angular安裝、創建項目、目錄結構、組件、服務 創建組件、綁定數據、綁定屬性、數據循環、條...
    地瓜粉絲閱讀 534評論 0 2