AngularJS 路由:ng-route 與 ui-router
AngularJS的ng-route模組為控制器和檢視提供了[Deep-Linking]URL。
通俗來講,ng-route模組中的$route
Service監測$location.url()
的變化,並將它對映到預先定義的控制器。也就是在客戶端進行URL的路由。
下面首先給出$route
的使用示例,然後引入一個更加強大的客戶端路由框架ui-router。
Angular 路由
在APP中定義多個頁面的控制器,並給出對應的模板。然後$routeProvider
進行配置,即可將URL對映到這些控制器和檢視。
首先定義一個基本的Angular APP,並引入ngRoute
:
Angular
$route
Service在ngRoute
模組裡。需要引入它對應的javascript檔案,並在我們的APP裡ngRoute
新增為模組依賴(如何新增模組依賴?)。
var app = angular.module('ngRouteExample', ['ngRoute'])
.controller('MainController', function($scope) {
})
.config(function($routeProvider, $locationProvider) {
$routeProvider
.when('/users', {
templateUrl : 'user-list.html',
controller: 'UserListCtrl'
})
.when('/users/:username', {
templateUrl: 'user.html',
controller: 'UserCtrl'
});
// configure html5
$locationProvider.html5Mode(true);
});
上述程式碼中,$routeProvider
/users
使用user-list.html
作為模板,UserListCtrl
作為控制器;/users/:username
則會匹配類似/users/alice
之類的URL,稍後你會看到如何獲得:username
匹配到的值。先看首頁的模板:
HTML5Mode: 伺服器端路由和客戶端路由的URL以
#
分隔。例如/foo/bar#/users/alice
,Angular通過操作錨點來進行路由。 然而html5Mode(true)
將會去除#
,URL變成/foo/bar/users/alice
(這需要瀏覽器支援HTML5的,因為此時Angular通過pushState
來進行路由)。 此時伺服器對所有的客戶端路由的URL都需要返回首頁(/foo/bar
)檢視,再交給Angular路由到/foo/bar/users/alice
對應的檢視。
<div ng-controller="MainController">
Choose:
<a href="users">user list</a> |
<a href="users/alice">user: alice</a>
<div ng-view></div>
</div>
注意到模板檔案中有一個div[ng-view]
,子頁面將會載入到這裡。
路由引數
接著我們定義上述路由配置的子頁面控制器和檢視模板。使用者列表頁面:
app.controller('UserListCtrl', function($scope) {});
<!--user-list.html-->
<h1>User List Page</h1>
使用者頁面:
app.controller('UserCtrl', function($scope, $routeParams) {
$scope.params = $routeParams;
});
<!--user.html-->
<h1>User Page</h1>
<span ng-bind="params.userName"></span>
我們點選首頁的/users/alice
時,將會載入user.html
,span
的值為alice
。$routeParams提供了當前的路由引數,例如:
// Given:
// URL: http://server.com/index.html#/Chapter/1/Section/2?search=moby
// Route: /Chapter/:chapterId/Section/:sectionId
//
// Then
$routeParams ==> {chapterId:'1', sectionId:'2', search:'moby'}
UI-Router
- 檢視不能巢狀。這意味著
$scope
會發生不必要的重新載入。這也是我們在Onboard中引入ui-route
的原因。 - 同一URL下不支援多個檢視。這一需求也是常見的:我們希望導航欄用一個檢視(和相應的控制器)、內容部分用另一個檢視(和相應的控制器)。
UI-Router提出了$state
的概念。一個$state
是一個當前導航和UI的狀態,每個$state
需要繫結一個URL
Pattern。 在控制器和模板中,通過改變$state
來進行URL的跳轉和路由。這是一個簡單的例子:
<!-- in index.html -->
<body ng-controller="MainCtrl">
<section ui-view></section>
</body>
// in app-states.js
$stateProvider
.state('contacts', {
url: '/contacts',
template: 'contacts.html',
controller: 'ContactCtrl'
})
.state('contacts.detail', {
url: "/contacts/:contactId",
templateUrl: 'contacts.detail.html',
controller: function ($stateParams) {
// If we got here from a url of /contacts/42
$stateParams.contactId === "42";
}
});
當訪問/contacts
時,contacts
$state
被啟用,載入對應的控制器和檢視。在ui-router時,通常使用$state
來完成頁面跳轉,
而不是直接操作URL。例如,在指令碼使用$state.go:
$state.go('contacts'); // 指定state名,相當於跳轉到 /contacts
$state.go('contacts.detail', {contactId: 42}); // 相當於跳轉到 /contacts/42
在模板中使用ui-sref(這是一個Directive):
<a ui-sref="contacts">Contacts</a>
<a ui-sref="contacts.detail({contactId: 42})">Contact 42</a>
巢狀檢視
不同於Angular原生的ng-route,ui-router的檢視可以巢狀,檢視巢狀通常對應著$state的巢狀。 contacts.detail
是contacts
的子$state
,contacts.detail.html
也將作為contacts.html
的子頁面:
<!-- contacts.html -->
<h1>My Contacts</h1>
<div ui-view></div>
<!-- contacts.detail.html -->
<span ng-bind='contactId'></span>
上述
ui-view
的用法和ng-view
看起來很相似,但不同的是ui-view
可以配合$state
進行任意層級的巢狀, 即contacts.detail.html
中仍然可以包含一個ui-view
,它的$state
可能是contacts.detail.hobbies
。
命名檢視
在ui-router中,一個$state
下可以有多個檢視,它們有各自的模板和控制器。這一點也是ng-route所沒有的,
給了前端路由極大的靈活性。來看例子:
<!-- index.html -->
<body>
<div ui-view="filters"></div>
<div ui-view="tabledata"></div>
<div ui-view="graph"></div>
</body>
這一個模板包含了三個命名的ui-view
,可以給它們分別設定模板和控制器:
$stateProvider
.state('report',{
views: {
'filters': {
templateUrl: 'report-filters.html',
controller: function($scope){ ... controller stuff just for filters view ... }
},
'tabledata': {
templateUrl: 'report-table.html',
controller: function($scope){ ... controller stuff just for tabledata view ... }
},
'graph': {
templateUrl: 'report-graph.html',
controller: function($scope){ ... controller stuff just for graph view ... }
}
}
})
相關推薦
AngularJS 路由:ng-route 與 ui-router
AngularJS的ng-route模組為控制器和檢視提供了[Deep-Linking]URL。 通俗來講,ng-route模組中的$routeService監測$location.url()的變化,並將它對映到預先定義的控制器。也就是在客戶端進行URL的路由。 下面
AngularJS路由巢狀,通過ui-route實現深層路由
1.前面我們通過了簡單的ng-route實現了簡單層次的路由,對於深層次的路由,我們可以通過ui-route來實現。 (1)ng-route的侷限性:一個頁面無法巢狀多個檢視,也就是說一個頁面只能有包含一個頁面一個控制器的切換。 (2)ui-route的改進
團隊任務2:原型設計與UI設計
ui設計 windows 老師 需求 基本 學習 軟件工程師 win 了解 團隊序號:9 開發軟件:二進制遊戲軟件 目標用戶:大一新生與計算機導論老師 撰寫博客:齊寵衡 2016035107180
團隊任務2:原型設計與UI設計1
mage 免費 下半部 模塊 blog 完美 方式 說明 減少 2號團隊,教師個人題庫管理系統,目標用戶:教師 博客撰寫人:何東方 學號:2016035107335 團隊中的職務:產品經理N:用戶需求:博客撰寫人姓名與學號以及在團隊中的職務。A:滿足用戶題目上傳,下載以及在
vue——this.$route 與 this.$router
this.$route 包含的是路由基本資訊,如fullPath等, this.$router 在原型鏈(__proto__)中包含路由的處理方法,如跳轉push等。 this.$router.push('/') //跳轉到根目錄,保留歷史記錄,可以返回 this.$
第3篇:angularJS使用ui-router的巢狀路由配置
引入js檔案: <script type="text/javascript" src="lib/angular/angular-1.3.0.js"></script>
第26篇:AngularJS+ui-router實現一個超簡單的登陸和跳轉的二級路由demo
1.頁面結構介紹: 1)index.html:頁面入口檔案; 2)views資料夾下: login資料夾下:登陸頁面和對應控制器; home資料夾下: home.html/home.js:二級路由頁面和對應的控制器 adv/list資料夾:二級頁面和對應的控制器檔案 3)
AngularJS進階 一 深入理解ANGULARUI路由 UI-ROUTER
深入理解ANGULARUI路由_UI-ROUTER 最近在用 ionic寫個webapp 看到幾個demo中路由有好幾種,搞的有點暈,查下資料研究下,做個筆記,其中大部分為摘抄別人的,做個說明免得被人吐槽。 Angularjs&nbs
AngularJS路由之ui-router(二)
模組建立時新增模組依賴“ui.router” var app = angular.module('myApp', ['ui.router']);後就可以使用一個叫做$state的服務,使用$stateProvider來配置這個服務. $stateProvider和angu
AngularJS路由之ui-router(三)
一、為ui-router新增進度條 在使用動態控制器或者ajax,新增資料的時候需要進度條提示, 我們可以使用路由狀態的事件新增全域性進度條提示 $stateChangeStart: 當狀態開始改變時觸發 $stateChangeSuccess: 當狀態改變結束時觸發 二
AngularJs之ui.router路由基本配置及傳參方法
使用AngularJs可以方便的做出單頁面應用,既然是應用,那就涉及到頁面跳轉的問題,使用Angularjs的路由外掛可以方便的使用路由功能,而且可以傳參非常容易。程式碼如下:路由外掛:angular-ui-router.js。檔案:index.html01<!DOCT
AngularJs ui-router 路由的簡單介紹
以上程式碼修飾了“views”直接通過state的名稱繫結完對應的頁面模板。 state(name,stateConfig); 註冊一個狀態,並給定其配置。 引數: name:狀態的名稱。 stateConfig:狀態配置物件。配置具有以下各項屬性: template: string/func
AngularJS ui-router (巢狀路由)
我們都知道,如果使用原生路由的話,Angular的檢視是通過ng-view這個指令進行載入的。比如這樣:<div ng-view></div>。一般,我們都會把這個指令放在index.html這個檔案裡面,然後,通過控制器來載入相應的模板檢視。比
AngularJS學習筆記--002--Angular JS路由外掛ui.router原始碼解析
路由(route),幾乎所有的MVC(VM)框架都應該具有的特性,因為它是前端構建單頁面應用(SPA)必不可少的組成部分。 那麼,對於angular而言,它自然也有內建的路由模組:叫做ngRoute。 不過,大家很少用它,因為它的功能太有限,往
Angular路由:ui-router
ui-router是AngularJs的一個客戶端路由框架。AngularJs ngRoute模組中的路由是通過URL路由來管理檢視的,ui-router則是通過狀態(state)來管理檢視,並且可以繫結路由和其它的行為。狀態被繫結到命名、巢狀和並行檢視,大大
AngularJS路由之ui-router(一)
在angular1有內建的路由服務,使用$route可以幫助實現路由的切換,檢視的改變,但是$route只是包含了基本的功能,在很多場合不夠用。 uiRouter是第三方js庫。需要引入“angular-ui-router.min.js”檔案。 在Asp.Net中引入
第4篇:ui-router 切換路由後頁面不回到頂部的解決辦法
在使用ui-router中用$state.go切換路由後,子頁面不會回到頂部而是停留在上一個子頁面對應的位置,若使用在ui-view使用autoscroll="true"的屬性,當路由頂部有導航時並不
AngularJS路由之ui-router(四)$state.go頁面跳轉
路由是這麼定義的: $stateProvider .state('page1', { url: '/page1', templateUrl: 'views/page1.htm', controller: 'page1Ctrl'
AngularJS學習之 ui router
ron span 登陸 也有 con 列表 tro 默認 blog 1.安裝 bower install --save angular_ui-router 2.在項目主頁面 index.html中添加 <div ui-view=""></ui-vie
遊戲UI框架設計(五): 配置管理與應用
unity界面框架 unityui框架 ui框架配置 unity配置管理 遊戲UI框架設計(五)--配置管理與應用 在開發企業級遊戲/VR/AR產品時候,我們總是希望可以總結出一些通用的技術體系,框架結構等,為簡化我們的開發起到“四兩撥千金”的作用。所謂“配置管理”是指一個遊戲項目(軟件項