赞
踩
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <title>Document</title>
- <script src="js/angular.min.js"></script>
- <script src="js/angular-ui-router.min.js"></script>
- </head>
- <body ng-app="myApp">
- <h1>AngularJS Home Page (Ui-router Demonstration)</h1>
- <div ui-view=""></div>
- </body>
- </html>
- <div>
- <div>
- <span style="width:100px" ui-sref=".Page1"><a href="">Page-1</a></span>
- <span style="width:100px" ui-sref=".Page2"><a href="">Page-2</a></span>
- <span style="width:100px" ui-sref=".Page3"><a href="">Page-3</a></span>
- </div>
- <div>
- <div ui-view=""/>
- </div>
- </div><strong>
- </strong>
- <!-- Page1.html -->
- <div>
- <div>
- <h1>Page 1 content goes here...</h1>
- </div>
- </div>
-
-
- <!-- Page2.html -->
- <div>
- <div>
- <h1>Page 2 content goes here...</h1>
- </div>
- </div>
-
-
- <!-- Page3.html -->
- <div>
- <div>
- <h1>Page 3 content goes here...</h1>
- </div>
- </div>
- var m1 = angular.module("myApp", ['ui.router']);
-
- m1.config(['$stateProvider','$urlRouterProvider',function($stateProvider,$urlRouterProvider){
-
- $urlRouterProvider.when("", "/tabPanel");
-
- $stateProvider
- .state("tabPanel", {
- url : "/tabPanel",
- templateUrl : "tabPanel.html"
- })
- .state("tabPanel.Page1", {
- url : "Page1",
- templateUrl : 'Page1.html'
- })
- .state("tabPanel.Page2", {
- url : "Page2",
- templateUrl : 'Page2.html'
- })
- .state("tabPanel.Page3", {
- url : "Page3",
- templateUrl : 'Page3.html'
- })
- }]);
<div ui-view></div>
元素中,在这些模板中也可以包含自己的ui-view,
这就是在同一个路由下实现嵌套视图的方法。要定义一个路由,与传统的方法相同:使用module.config
方式,但引入的服务不是$routeProvider,
而是$stateProvider。
ngRoute
相似,开发者可以指定任何已经被注册的控制器,或者在路由里面创建一个作为控制器的函数。但如果没有定义模板,控制器将无效。/tabPanel
时,该应用将状态改为tabPanel,同时向 Main.html 中带有 ui-view 属性的元素中插入模板。URL参数有多个选项,因此它非常强大,开发者可以像下面这样设置最基本的参数:- $stateProvider
- .state("tabPanel", {
- url : "/tabPanel/:num",
- template : "<h1>控制面板</h1>",
- controller : function($scope, $stateParams){
- $scope.num = $stateParams.num;
- }
- });
现在将 :num 作为URL的第二个部分,例如:访问 /tabPanel/1 ,那么 $stateParams.num
就为1($stateParams就是一个对象,{num:1})。同时也可使用不同的语法:
url : "/tabPanel/{num}"
路径必须匹配URL,与ngRoute不同的是,当用户访问到 /tabPanel/
时,上面的的路径会被激活,然而当访问到 /tabPanel
时不会被激活。路径同时也使开发者可以使用正则表达式来匹配,例如:
url : "/tabPanel/{num:[0-9]{6}}" //规定num必须为六位数字
在路径里也可以指定查询参数:
url : "tabPanel?name" /* /tabPanel?name=leo 将会被匹配 */
在上面提及使用 $stateParams 来提取在url中的不同参数。该服务的作用是处理url的不同部分。例如,当上述的 tabPanel 状态是这样时:
- //当用户访问者链接时:'/tabPanel/123/messages/ascending?from=10&to=20'
- url: '/tabPanel/:num/messages/{sorted}?from&to'
$stateParams
对象的值为:{ num: '123', sorted: 'ascending', from: 10, to: 20 }
开发者可以在一个状态中设置多个有名称的视图。该功能在ui-router中很强大,开发者可以在同一个模板中改变和切换不同的视图。如果设置了视图选项,则该状态的‘template’,‘templateUrl’及‘templateProvider’将被忽略。如果想在路由里包含父级模板,就需要创建一个包含模板的抽象模板。例如有这样的视图:
- <div>
- <div ui-view="student"></div>
- <div ui-view="teacher"></div>
- <div ui-view="classroom"></div>
- </div>
接下来就可以将创建的模板分别插入到上述 有命名的 ui-view 视图了,每个子视图可以包含自己的模板、控制器和预载入数据:
- $stateProvider
- .state('tabPanel', {
- views : {
- student : {
- template : "<h1>学生课余活动</h1>",
- controller : function ($scope){
- //...
- }
- },
- teacher : {
- templateUrl : "teacher.html",
- },
- classroom : {
- template : "<h1>教室一角</h1>",
- }
- }
- })
abstract
属性外,其他设置和设定一个常规状态是相同的:- $stateProvider
- .state('tabPanel', {
- abstract : true,
- url : '/tabPanel',
- template : "<div ui-view></div>"
- })
- .state("tabPanel.Page1", {
- url : "/Page1",
- templateUrl : 'Page1.html'
- })
- .state("tabPanel.Page2", {
- url : "/Page2",
- templateUrl : 'Page2.html'
- })
- .state("tabPanel.Page3", {
- url : "/Page3",
- templateUrl : 'Page3.html'
- })
使用预载入功能,开发者可以预先载入一系列依赖或者数据,然后注入到控制器中。在 ngRoute
中 resolve
选项可以允许开发者在路由到达前载入数据保证(promise)。预载入选项需要一个对象,这个对象的key即要注入到控制器的依赖,这个对象的value为需要被载入的 factory
服务。如果传入的是字符串,ngRoute会试图匹配已经注册的服务。如果传入的是函数,该函数将会被注入,并且该函数返回的值便是控制器的依赖之一。如果该函数返回一个数据保证(promise),这个数据保证将在控制器被实例化前被预先载入并且数据会被注入到控制器中。
- $stateProvider.state('home', {
- resolve: {
- //这个函数的值会被直接返回,因为返回值不是promise对象
- person: function() {
- return {
- name: "Ari",
- email: "ari@fullstack.io"
- }
- },
- //这个函数返回的是promise对象, 因此它将在控制器被实例化之前载入。
- currentDetails: function($http) {
- return $http({
- method: 'JSONP',
- url: '/current_details'
- });
- },
- //前一个promise对象也可作为依赖注入到其他数据保证中!(这个非常实用)
- facebookId: function($http, currentDetails) {
- $http({
- method: 'GET',
- url: 'http://facebook.com/api/current_user',
- params: {
- email: currentDetails.data.emails[0]
- }
- })
- }
- },
-
- //定义控制器
- controller: function($scope, person,
- currentDetails, facebookId) {
- $scope.person = person;
- }
- })
$rootScope
上触发,因此在任何$scope对象上都可以监听到这些事件。- $scope.$on('$stateChangeStart', function(evt, toState, toParams, fromState, fromParams), {
- // 如果需要阻止事件的默认行为
- evt.preventDefault();
- });
- $scope.$on('$viewContentLoading', function(event, viewConfig){
- // 获取任何视图设置的参数,以及一个特殊的属性: viewConfig.targetView
- //...
- });
- m1.config(function($urlRouterProvider) {
- $urlRouterProvider.when('', '/tabPanel');
- });
如果传递的是函数,在路径被匹配时该函数会被执行,处理器返回如下3个值中的一个:
- m1.config(function($urlRouterProvider) {
- $urlRouterProvider.otherwise('/');
- /*$urlRouterProvider.otherwise(
- function($injector, $location) {
- $location.path('/');
- });*/
- });
- m1.config(function($urlRouterProvider){
- $urlRouterProvider.rule(
- function($injector, $location) {
- return '/index';
- });
- })
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。