當專案越來越複雜,需要控制的東西就會越來越多,因此 AngularJS 也提供了 $route 跟 view 的功能可以透過 routing 來切換不同的 view
不過有一點要注意的是,AngularJS中的 route 其實都是同一頁(SPA),所以在url的參數上會是帶在 # 之後
例如:
index.html#/ index.html#/edit index.html#/profile
基本 route 與 view 應用
首頁 index.html(使用了 BallApp Module)
<!DOCTYPE HTML> <html ng-app="BallApp"> <head> <meta charset="utf-8"> <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.17/angular.min.js"></script> <!-- 使用 $route module 必須再引入 angulare-route.js --> <script src="https://code.angularjs.org/1.2.17/angular-route.js"></script> <script src="module.js"></script> </head> <body> <h2>View Render</h2> <!-- 使用 ng-view 屬性決定 view 載入的位置 --> <div ng-view></div> </body> </html>
module.js
// 要使用$route時必須帶入ngRoute module 及 route 設定 var ballApp = angular.module('BallApp', ['ngRoute'], function($routeProvider) { // 指定 route 及載入的 view $routeProvider.when('/', { templateUrl: 'view.html' }) .when('/edit', { templateUrl: 'edit.html' }) // 不符合以上規則的利用 otherwise 統一導到固定的view .otherwise({ redirectTo: '/' }); }); // 新增 Controller ballApp.controller('NameCtrl', function($scope) { $scope.persons = ['Johnson', 'Febr', 'Minnine']; });
view.html
<ul> <li ng-repeat="name in persons">{{name}}</li> </ul>
$route 帶入參數
module.js
var ballApp = angular.module('BallApp', ['ngRoute'], function($routeProvider) { $routeProvider.when('/', { templateUrl: 'view.html' }) // 使用冒號決定參數名稱 .when('/hello/:message', { templateUrl: 'hello.html', // 設定 view 的 controller controller: 'HelloCtrl' }) .otherwise({ redirectTo: '/' }); }); // 透過 $routeParams 帶入參數 ballApp.controller('HelloCtrl', function($scope, $routeParams) { $scope.message = $routeParams.message; });
hello.html
<div>Hello, {{message}}</div>
URL
index.html#/hello/baby
實際應用(點擊姓名後進入修改畫面)
module.js
var ballApp = angular.module('BallApp', ['ngRoute'], function($routeProvider) { // Route $routeProvider.when('/', { templateUrl: 'view.html' }) .when('/edit/:index', { templateUrl: 'edit.html', controller: 'EditCtrl' }) .otherwise({ redirectTo: '/' }); }); // Controller ballApp.controller('NameCtrl', function($scope) { $scope.persons = ['Johnson', 'Febr', 'Minnine']; }).controller('EditCtrl', function($scope, $routeParams) { $scope.index = $routeParams.index - 1; });
view.html
<ul ng-controller="NameCtrl"> <li ng-repeat="name in persons"> <a ng-href="#/edit/{{$index + 1}}">{{name}}</a> </li> </ul>
edit.html
<!-- 因為需要使用到persons陣列,因此引用NameCtrl --> <form ng-controller="NameCtrl"> <input ng-model="persons[index]"> </form>