本篇介紹angular中如何通過判斷url的hash值來顯示不同的檢視模板,並使用不同的控制器:
下面,通過一個例子,來一步一步說明它的用法:
我們要做一個郵箱應用,開啟的時候顯示的是郵件列表:
然後點選郵件主題,可以檢視該郵件的詳細內容:
點選返回列表,再回到列表頁
一. 建立index頁面:
<!DOCTYPE html> <html> <head> <title>14.1路由和檢視切換</title> <meta charset="utf-8"> <script src="../../angular.js"></script> <script src="controller.js"></script> <link type="text/css" href="style.css" rel="stylesheet" /> </head> <body> <div ng-app="A-Mail"> <h3>A-Mail</h3> <br> <div ng-view></div> </div> </body> </html>
這一步需要做的事情有:
①. 通過ng-app,使用某個模型來管理頁面
②. 通過ng-view,建立空的div,裡面的內容會根據url的hash值來呼叫不同的檢視模板,並且使用不同的控制器
③. 寫好公共的,始終被顯示的檢視部分,比如這裡的標題: <h3>A-Mail</h3>
二. 建立需要被呼叫的其它檢視, 也就會是放在ng-view中的檢視模板:
①list.html:
<table> <tr><th>發件人</th><th>主題</th><th>傳送時間</th></tr> <tr ng-repeat="message in messages"> <td>{{message.sender}}</td><td><a href="#/view/{{message.id}}">{{message.subject}}</a></td><td>{{message.date}}</td> </tr> </table>
當hash值為空的時候,ng-view中應該顯示的是郵件的列表.
注意,其中郵件的連結應該使用"#/..." 使用#開頭表示改變路徑的hash值
比如我輸入這個連結:
http://localhost:801/angular/OREILLY/14.1.路由和檢視切換/index.html
開啟後,它會自己變成:
http://localhost:801/angular/OREILLY/14.1.路由和檢視切換/index.html#/
如果跳轉到"#/view/001",
url就會變成: http://localhost:801/angular/OREILLY/14.1.路由和檢視切換/index.html#/view/001
②detail.html:
<p><b>主題:</b><span>{{message.subject}}</span></p> <p><b>發件人:</b><span>{{message.sender}}</span></p> <p><b>傳送時間:</b><span>{{message.date}}</span></p> <h4>To:</h4> <ul class="clear_float"><li ng-repeat="name in message.recipients">{{name}}; </li></ul> <hr> <div>{{message.content}}</div> <a class="button" href="#/">返回列表</a>
當hash值為view/id的時候,顯示的應該是當前id的郵件詳細內容
返回列表按鈕返回到沒有hash值的路徑
三. 建立模組,路由,控制器:
var messages = [ { "id":"001", "sender":"兔小寶", "subject":"給小寶買草", "date":"Dec 7, 2014 12:32:00", "recipients": ["小a","米米","小黑"], "content":"今天一定要給我買草啊!!!" }, { "id":"002", "sender":"周孝剛", "subject":"給小寶加水", "date":"May 12, 2014 05:04:00", "recipients": ["兔兔","粥粥","小白"], "content":"今天一定要給小寶加水啊!!!" }, { "id":"003", "sender":"code_bunny", "subject":"買涼蓆", "date":"Thu 14, 2014 04:14:00", "recipients": ["white_bunny","sb","小米"], "content":"今天一定要給買涼蓆啊!!!" } ]; var aMail = angular.module('A-Mail',[]); aMail.controller('listControll',function($scope){ $scope.messages = messages; }); aMail.controller('detailControll',function($scope, $routeParams){ var index = parseInt($routeParams.id)-1; $scope.message = messages[index]; }); aMail.config(function($routeProvider){ $routeProvider.when('/',{controller:'listControll',templateUrl:'view/list.html'}).when('/view/:id',{controller:'detailControll',templateUrl:'view/detail.html'}).otherwise({redirectTo:'/'}) });
①.messages是虛擬的資料
②.建立該應用使用的模型
③.給該模型建立兩個控制器,分別用於控制郵件列表檢視和郵件詳細內容檢視
④.給該模型配置路由:
aMail.config(function($routeProvider){
$routeProvider.when('hash1',{controller:'someController1',templateUrl:'path/to/view1}).when('hash2',{controller:'someController2',templateUrl:'path/to/view2'})....when().otherwise({redirectTo:'/'})
})
config方法傳入一個函式,函式中傳入引數"$routeProvider"作為服務.
$routeProvider.when(hash,obj)用於配置路由:
hash: 字串格式. 匹配url的hash值,注意這裡不要#, '/' 就表示hash值為空.
obj: 一個json物件,物件有以下這些屬性:
controller: '控制器' : 字串格式,定義控制ng-view元素的控制器
template: '檢視模板' : 字串格式,定義ng-view元素下應該使用哪個檢視模板來填充內容,寫的是檢視模板的路徑
redirectTo: '路徑' : 字串格式,定義重定向到哪裡,注意定義的也是hash值
$routeProvider.otherwise()用於當沒有匹配到任何路由的時候執行的內容:
引數和when的第二個引數用法一致
⑤.$routeParams服務:
關於服務的概念,可以參考這篇:http://www.cnblogs.com/liulangmao/p/3727808.html
$routeParems可以獲取到一個引數化的url元件.這個元件比較複雜,單就這個例子來看,我們在配置路由的時候在when的url屬性傳入了/view/:id作為匹配,這樣,就會把'view/'後面的內容,作為$routeParems物件的id屬性值