1. 程式人生 > >AngularJS 路由:ng-route 與 ui-router

AngularJS 路由:ng-route 與 ui-router

AngularJSng-route模組為控制器和檢視提供了[Deep-Linking]URL。 通俗來講,ng-route模組中的$routeService監測$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

定義了兩個URL的對映:/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.htmlspan的值為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

  1. 檢視不能巢狀。這意味著$scope會發生不必要的重新載入。這也是我們在Onboard中引入ui-route的原因。
  2. 同一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-routeui-router的檢視可以巢狀,檢視巢狀通常對應著$state的巢狀。 contacts.detailcontacts的子$statecontacts.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: 當狀態改變結束時觸發 二

AngularJsui.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產品時候,我們總是希望可以總結出一些通用的技術體系,框架結構等,為簡化我們的開發起到“四兩撥千金”的作用。所謂“配置管理”是指一個遊戲項目(軟件項