如何使用ui-router渐苏?


1.背景介紹

UI-Router它是一個(gè)讓開發(fā)者能夠根據(jù)URL狀態(tài)或者說是'機(jī)器狀態(tài)'來組織和控制界面UI的渲染,而不是僅僅只改變路由(傳統(tǒng)AngularJS應(yīng)用實(shí)用的方式)。該模塊為開發(fā)者提供了很多視圖(view)額外的控制于樟。開發(fā)者可以創(chuàng)建嵌套分層的視圖艘希、在同一個(gè)頁面使用多個(gè)視圖硼身、讓多個(gè)視圖控制某個(gè)視圖等更多的功能鉴未。


2.知識剖析

$stateProvider:管理狀態(tài)定義、當(dāng)前狀態(tài)和狀態(tài)轉(zhuǎn)換鸠姨。包含觸發(fā)狀態(tài)轉(zhuǎn)換的事件和回調(diào)函數(shù)铜秆,異步解決目標(biāo)狀態(tài)的任何依賴項(xiàng),更新$location到當(dāng)前狀態(tài)讶迁。由于狀態(tài)包含關(guān)聯(lián)的url连茧,通過$urlRouterProvider生成一個(gè)路由規(guī)則來執(zhí)行轉(zhuǎn)換的狀態(tài)。

ui-view指示器:渲染狀態(tài)中定義的視圖巍糯,是狀態(tài)中定義的視圖的一個(gè)占位符啸驯。


$urlRouter /$urlRouterProvider:管理了一套路由規(guī)則列表來處理當(dāng)$location發(fā)生變化時(shí)如何跳轉(zhuǎn)。最低級的方式是祟峦,規(guī)則可以是任意函數(shù)罚斗,來檢查$location,并在處理完成時(shí)候返回true宅楞。支持正則表達(dá)式規(guī)則和通過$urlMatcherFactory編譯的UrlMatcher對象的url占位符規(guī)則针姿。

$urlMatcherFactory:將url和占位符編譯為UrlMatcher對象。除了$routeProvider支持的占位符語法之外厌衙,它還支持?jǐn)U展語法距淫,允許一個(gè)正則表達(dá)式指定占位符,并且能夠提取命名參數(shù)和查詢url的一部分婶希。


首先引入源文件榕暇,接下來將UI-Router作為web應(yīng)用的依賴,注入到主程序:

angular.module('myApp',['ui.router'])

與集成的ngRoute服務(wù)不同的是喻杈,UI-Router可以將視圖嵌套彤枢,因?yàn)樗诘氖遣僮鳡顟B(tài)而僅非URL。與傳統(tǒng)做法使用ng-view不同的是筒饰,在ngRoute里需要使用ui-view服務(wù)缴啡。當(dāng)在ui-router中處理路由和狀態(tài)時(shí),開發(fā)者的重心是當(dāng)前的狀態(tài)是什么以及在哪一個(gè)頁面里龄砰。

和ngRoute一樣盟猖,為特定狀態(tài)指定的模板將會(huì)放在ui-view元素中。在這些模板中也可以包含自己的ui-view,這就是在同一個(gè)路由下實(shí)現(xiàn)嵌套視圖的方法换棚。要定義一個(gè)路由式镐,與傳統(tǒng)的方法相同:使用.config方式,但使用的不是$routeProvider而是$stateProvider固蚤。


模板娘汞,模板路徑,模板Provider

.config(function($stateProvider, $urlRouterProvider) {

$stateProvider

.state('start', {

url: '/start',

templateUrl: 'Hello {{ name }}';

})

上述代碼在設(shè)置對象上定義了一個(gè)叫start的狀態(tài)夕玩。設(shè)置對象stateConfig和路由設(shè)置對象的選項(xiàng)是非常相似的你弦。開發(fā)者可以在每個(gè)視圖下使用如下方式來設(shè)置模板template -HTML字符串惊豺,或者是返回HTML字符串的函數(shù)templateUrl - HTML模板的路徑,或者是返回HTML模板路徑的函數(shù)templateProvider,返回HTML字符串的函數(shù)禽作。

url選項(xiàng)將會(huì)為該應(yīng)用的狀態(tài)指定一個(gè)URL基于用戶瀏覽該應(yīng)用所在的狀態(tài)尸昧。這樣當(dāng)在瀏覽該應(yīng)用的時(shí)候便能實(shí)現(xiàn)深度鏈接的效果。


$stateProvider

.state('inbox', {

url: '/inbox/:inboxId',

template: 'Welcome to修真院',

controller: function($scope, $stateParams) {

$scope.inboxId = $stateParams.inboxId;

}

});

當(dāng)用戶瀏覽到/index時(shí)旷偿,該應(yīng)用將狀態(tài)改為index同時(shí)向主ui-view元素中插入template中的內(nèi)容烹俗。

inboxId為URL的第二個(gè)部分,例如:訪問/inbox/1,那么$stateParams.inboxId就為1($stateParams為{inboxId:1})萍程。同時(shí)也可使用不同的語法:url: '/inbox/{inboxId}'


嵌套路由

使用url參數(shù)可以實(shí)現(xiàn)嵌套的路由幢妄,有了嵌套路由便可在同一個(gè)模板同一個(gè)路由實(shí)現(xiàn)多層次的ui-view,例如在/inbox中嵌入更多路由:

$stateProvider

.state('inbox', {

url: '/inbox/:inboxId',

template: 'Welcome to修真院

\

Show priority\

\

',

controller: function($scope, $stateParams) {

$scope.inboxId = $stateParams.inboxId;

}

})

.state('inbox.priority', {

url: '/priority',

template: 'Your priority inbox'

});

.state('inbox.priority'是/inbox下的一個(gè)子路由:state( . )語法指定了它使子路由茫负。/inbox/1將匹配第一個(gè)路由蕉鸳,而/inbox/1/priority會(huì)匹配第二個(gè)路由。使用這種語法忍法,在父視圖中的ui-view元素將會(huì)由第二個(gè)路由控制潮尝。


Views視圖

開發(fā)者可以在同一個(gè)模板中改變和切換不同的視圖。如果設(shè)置了視圖選項(xiàng)缔赠,則該狀態(tài)的‘template’衍锚,‘templateUrl’及‘templateProvider’將被忽略友题。如果想在路由里包含父級模板嗤堰,就需要?jiǎng)?chuàng)建一個(gè)包含模板的抽象模板。例如:

ui-view="filters"

ui-view="mailbox"

ui-view="priority"

接下來創(chuàng)建分別被插入到上述ui-view的有命名的視圖度宦,每個(gè)子視圖可以包含自己的模板踢匣、控制器和預(yù)載入數(shù)據(jù)。

$stateProvider

.state('inbox', {

views: {

'filters': {

template: 'Filter inbox',

controller: function($scope) {}

},

'mailbox': {

templateUrl: 'Mail inbox'

},

'priority': {

template: 'Priority inbox',

}

}

});


$stateParams狀態(tài)參數(shù)

該服務(wù)的作用是處理url的不同部分戈抄。例如离唬,當(dāng)上述的inbox狀態(tài)是這樣時(shí):

url: '/inbox/:inboxId/messages/{sorted}?from&to'

當(dāng)用戶訪問者鏈接時(shí):

url: '/inbox/123/messages/ascending?from=10&to=20'

$stateParams對象的值為:

{inboxId: '123', sorted: 'ascending', from: 10, to: 20}


$urlRouterProvider

開發(fā)者可以在該對象上設(shè)定特定的URL被激活時(shí)做什么的規(guī)則。由于設(shè)定好的狀態(tài)在特定的url被訪問是會(huì)自動(dòng)激活划鸽,所以$urlRouterProvider沒有必要用來管理激活和載入狀態(tài)输莺。但當(dāng)需要管理哪些被發(fā)生在當(dāng)前狀態(tài)之外的作用域scope時(shí)它會(huì)非常有用,例如在重定向或者安全驗(yàn)證的時(shí)候裸诽。在模塊的設(shè)置函數(shù)里便可使$urlRouterProvider嫂用。


when()

該函數(shù)需要兩個(gè)參數(shù):1.當(dāng)前的路徑,2.需要重定向到的路徑(或者是需要在路徑被訪問是運(yùn)行的函數(shù))丈冬。設(shè)置重定向前需要為$urlRouterProvider設(shè)置when函數(shù)來接受一個(gè)字符串嘱函。例如,當(dāng)希望重定向一個(gè)空的路由到/inbox:

.config(function($urlRouterProvider) {

$urlRouterProvider.when('', '/inbox');

});


otherwise()

和ngRoute的otherwise()函數(shù)相似埂蕊,在用戶提交的路徑?jīng)]有被定義的時(shí)候它將重定向到指定的頁面往弓。這是個(gè)創(chuàng)建’默認(rèn)‘路徑的好方法疏唾。otherwise()只接受一個(gè)參數(shù),要么函數(shù)要么字符串函似,字符串必須為合法的url路由地址槐脏,函數(shù)則會(huì)在沒有任何路徑被匹配的時(shí)候被運(yùn)行。

.config(function($urlRouterProvider) {

$urlRouterProvider.otherwise('/');

// or

$urlRouterProvider.otherwise(

function($injector, $location) {

$location.path('/');

});

});


rule()

如果想越過任何URL的匹配或者在其他路由前做路由修改撇寞,則可以使用rule()函數(shù)准给。在使用它的時(shí)候必須返回一個(gè)合法的代表路徑的字符串。

app.config(function($urlRouterProvider){

$urlRouterProvider.rule(

function($injector, $location) {

return '/index';

});

})


參考文獻(xiàn)

深入理解ANGULARUI路由_UI-ROUTER:

www.cnblogs.com/hughtxp/p/3965916.html

PPT: ? ?http://chowhengguang.oschina.io/demo/PPT10.html#/


如何使用ui-router重抖?_騰訊視頻
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末露氮,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子钟沛,更是在濱河造成了極大的恐慌畔规,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件恨统,死亡現(xiàn)場離奇詭異叁扫,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)畜埋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進(jìn)店門莫绣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人悠鞍,你說我怎么就攤上這事对室。” “怎么了咖祭?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵掩宜,是天一觀的道長。 經(jīng)常有香客問我么翰,道長牺汤,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任浩嫌,我火速辦了婚禮檐迟,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘码耐。我一直安慰自己追迟,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布伐坏。 她就那樣靜靜地躺著怔匣,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上每瞒,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天金闽,我揣著相機(jī)與錄音,去河邊找鬼剿骨。 笑死代芜,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的浓利。 我是一名探鬼主播挤庇,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼贷掖!你這毒婦竟也來了嫡秕?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤苹威,失蹤者是張志新(化名)和其女友劉穎昆咽,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體牙甫,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡掷酗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了窟哺。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片泻轰。...
    茶點(diǎn)故事閱讀 38,018評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖且轨,靈堂內(nèi)的尸體忽然破棺而出浮声,到底是詐尸還是另有隱情,我是刑警寧澤殖告,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布阿蝶,位于F島的核電站,受9級特大地震影響黄绩,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜玷过,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一爽丹、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧辛蚊,春花似錦粤蝎、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春碑宴,著一層夾襖步出監(jiān)牢的瞬間软啼,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工延柠, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留祸挪,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓贞间,卻偏偏與公主長得像贿条,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子增热,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 【JS-6】 如何使用ui-router整以? 小課堂【武漢分院第137期】 分享人:徐恒 目錄 1.背景介紹 2.知...
    愛上Shu的小刺猬閱讀 1,969評論 2 5
  • 大家好悄蕾,我是IT修真院深圳分院第04期學(xué)員,一枚正直善良的web程序員础浮。 今天給大家分享一下帆调,修真院官網(wǎng) js任務(wù)...
    仿佛鋒閱讀 1,757評論 0 0
  • 1.背景介紹 路由(route)是前端構(gòu)建單頁面應(yīng)用(SPA)必不可少的組成部分。 對于angular而言豆同,自然也...
    OB丶Koro1閱讀 253評論 0 0
  • 大家好影锈,我是IT修真院鄭州分院第三期的學(xué)員王相博芹务,一枚正直、純潔鸭廷、善良的前端程序員 今天給大家分享一下枣抱,修真院官網(wǎng)...
    More_ce0d閱讀 328評論 0 0
  • 時(shí)隔多年,他再看到朋友圈里她的照片心頭還是不禁一顫辆床。 近照上佳晶,她烏發(fā)早已及腰,朱顏也褪去了當(dāng)時(shí)的青稚讼载。 往年舊事種...
    慵庸閱讀 117評論 0 0