1. AngularJS路由介紹
AngularJS路由功能是一個純前端的解決方案,與我們熟悉的後台路由不太一樣。後台路由,通過不同的URL會路由到不同的控制器上(controller),再渲染(render)到頁面(HTML)。AngularJS的前端路由,需求提前對指定的(ng-app),定義路由規則(routeProvider),然後通過不同的URL,告訴(ng-app)載入哪個頁面(HTML),再渲染到(ng-app)視圖(ng-view)中。
AngularJS的前端路由,雖然URL輸入不一樣,頁面展示不一樣,其實完成的單頁(ng-app)視圖(ng-view)的局部重新整理。這樣來看,AngularJS做單頁應用就有點標配的感覺了。
從這個角度想想,要實現一個gmail的應用,真的就不難了。
例子
AngularJS 本身就涉及到了WEB開發理念中的MVC,即模型 視圖 控制器
而在PHP開發中已經有一套MVC的模型,難免有些暈
此段代碼主要功能:根據URL動態參數變化,動態替換AngularJS所指定的模板
http://網域名稱/index.html#/role/edit/2 指向 http://網域名稱/role/edit?id=2
http://網域名稱/index.html#/role/edit/3 指向 http://網域名稱/role/edit?id=3
參數詳解:
url: 是匹配的url規則
templateUrl: 是指定模板,此參數可以
上代碼:
代碼如下 |
複製代碼 |
// 編輯角色 .state('/role/edit', { url: "/role/edit/:id", //url: "/role/edit?id", templateUrl: function($routeParams) { return '/role/edit?id=' + $routeParams.id + '&_=' + Math.random(); //new Date().getTime(); }, data: {pageTitle: '編輯角色'}, controller: "GeneralPageController", resolve: { deps: ['$ocLazyLoad', function($ocLazyLoad) { return $ocLazyLoad.load([{ name: 'MetronicApp', insertBefore: '#ng_load_plugins_before', files: [] }]); }] } }) |
url 後面增加了js隨機數 防止緩衝 Math.random()
好了,我們再看一個項目布局的例子
目錄
AngularJS路由介紹
路由的代碼實現
實現效果截圖
. 路由的代碼實現
理論不多說了,直接上代碼!! 還是基於我們之前用yeoman構建的項目。
業務情境:論壇功能,貼文清單頁(list.html) 和 文章內容頁(detail.html)。
代碼檔案:
1. 增加:app/demo-route.html
2. 增加:app/views/route/list.html
3. 增加:app/views/route/detail.html
4. 修改: app/scripts/app.js
5. 修改: app/scripts/controllers/main.js
1). 增加:app/demo-route.html
這個檔案是首頁面(ng-app),包含視圖(ng-view)
代碼如下 |
複製代碼 |
<!doctype html> <head> <meta charset="utf-8"> <title>route</title> </head> <body ng-app="routeApp"> <h1>Route Demo index</h1> <div ng-view></div> <script src="bower_components/angular/angular.js"></script> <script src="scripts/app.js"></script> <script src="scripts/controllers/main.js"></script> </body> </html> |
2). 增加:app/views/route/list.html
這個頁面是布局模板,是HTML的程式碼片段。包括了一組ID的列表,通過ID列表的連結,可以進入到ID的詳細頁面。
代碼如下 |
複製代碼 |
<hr/> <h3>Route : List.html</h3> <ul> <li ng-repeat="id in [1, 2, 3 ]"> <a href="#/list/{{ id }}"> ID{{ id }}</a> </li> </ul> |
3). 增加:app/views/route/detail.html
這個頁面是布局模板,是HTML的程式碼片段。通過ID訪問,包含ID號, (ID的文章內容)
<hr/>
<h3>Route <span style="color: red;">{{id}}</span>: detail.html </h3>
4). 修改: app/scripts/app.js
這個是ng-app檔案的定義,我們在demo-route.html中定義了routeApp,在這裡需要聲明。
代碼如下 |
複製代碼 |
var routeApp = angular.module('routeApp',[]); routeApp.config(['$routeProvider',function ($routeProvider) { $routeProvider .when('/list', { templateUrl: 'views/route/list.html', controller: 'RouteListCtl' }) .when('/list/:id', { templateUrl: 'views/route/detail.html', controller: 'RouteDetailCtl' }) .otherwise({ redirectTo: '/list' }); }]); |
在routeApp模組中,我們定義了路由和布局模板。routeApp的預設URL是/list,即http://localhost:9000/demo-route.html#/list。 跳轉詳細頁的路由是/list/:id,id為參數。
同時,/list的布局模板是views/route/list.html,屬於RouteListCtl的控制器管理空間。
5). 修改: app/scripts/controllers/main.js
這個檔案定義控制器controller。
代碼如下 |
複製代碼 |
routeApp.controller('RouteListCtl',function($scope) { }); routeApp.controller('RouteDetailCtl',function($scope, $routeParams) { $scope.id = $routeParams.id; }); |
分別對應該路由中的兩個控制器聲明。
程式寫好,我們開啟瀏覽器看效果。
3. 實現效果截圖
別忘了用下面命令,啟動程式。
grunt server
瀏覽器被自動開啟,預設出的是http://localhost:9000/demo-route.html#/list, “#/list”是被redirectTo轉向的結果。
頁面被重新整理了,出了detil的頁面。同時,我們注意觀察,頁面沒有整個重新整理,而在視圖中(ng-view)做的局部重新整理。因為,chrome的開發工具的監控中,只是看到detail.html被載入。
我們再瀏覽地址欄中,輸入212
http://localhost:9000/demo-route.html#/list/212
觀察chrome的開發工具的監控中,沒有任何的networking操作。
在瀏覽地址欄中,再輸入原來list的地址
http://localhost:9000/demo-route.html#/list
觀察chrome的開發工具的監控,確認沒有任何變化!!
從這個實驗,我們看到AngularJS純前端路由的實現思路,配合視圖的局部重新整理,把業務功能切片後分散到HTML的模板頁面中。非常容易地實現了widget。並且,這種widget可重用性會非常高,能大大減少前端代碼量。