从技术上来说AJAX应用确实是单页面应用(即在第一个请求时加载一个HTML页面,后面只刷新DOM中的局部区域),但是很多时候,出于各种原因,我们需要为用户展示或隐藏一些子页面视图。针对这一方面,我们可以利用Angular 的 $route 服务来管理这种场景。可以利用路由服务来定义这样一种东西:对于浏览器所指定的特定URL,Angular 将会加载并显示一个模板,并实例化一个控制器来为模板提供内容。
angular.min.js
angular-resource.min.js
angular-route.min.js
var app = angular.module("appName",["需要引入的模块"]);
app.config(["$routeProvider", "$provide", function($routeProvider, $provide){
$routeProvider
.when('/', redirectTo: '/index')
.when('/:page', {
templateUrl: function($routeParams){
return "module/" + $routeParams.page + '/index.html';
}
})
.when('/特定url', redirectTo: '/特定页面')
.otherwise({
redirectTo: '/index'
});
}]);
'ngRoute'
$routeProvider
,这里也可以写成 app.config(function($routeProvider, $provide){//内容主体})
when('/特定URL', redirectTo: '特定页面地址')
,这种为根据特定的URL跳转到特定的页面when('/特定URL', {controller:'该模板页面对应的controller', templateUrl: '模板地址'})
,如果指定了controller,首先需要在主模块中引入该controller,如我有一个controller:angular.module('testController',[]).controller('controllerName',function(){})
,则在主模块[]
中引入即可 ['testController']
(请务必先将controller所在js文件加载)when('/:page', {templateUrl: function($routeParams){return "module/" + $routeParams.page + '/index.html';}})
如果整个项目的页面有一定的规则,如在这里页面都位于module
文件夹下,并且都是位于page指定的子文件夹的index,html页面,则可以直接在URL上使用占位符 /:page
,再通过$routeParams获得URL中:page
所指定的值,拼装后即是完整的路劲。如,我需要跳转至module/test/index,html
页面,则我只要将地址写为/test
即可。otherwise({redirecTo:'/index'})
,告诉路由在没有匹配到任何东西时跳转到该配置指定下的路劲redirectTo
,跳转至指定路劲$location
,需要跳转页面时直接使用$location.path('/地址')
。如angular.module('testController',[]).controller('controllerName',function($scope, $location){
function test(){
$location.path('/地址');
}
})
AngularJs 除了自带的固有指令外,还可以自定义指令来实现一些特殊的需求。
var myModule = angular.module(...);
myModule.directive('namespaceDirectiveName', function(injectables){
var directiveDefinitionObject = {
restrict: string,
priority: number,
template: string,
templateUrl: string,
replace: bool,
transclude: bool,
scope: bool or object,
controller: function controllerConstructor($scope, $element, $attrs, $transclude),
require: string,
link: function postLink(scope, iElement, iAttrs){...},
complie: function compile(tElement, tAttrs, transclude){
return {
pre: function preLink(scope, iElement, iAttrs, controller){...},
post: function postLink(scope, iElement, iAttrs, controller){...}
}
}
}
return directiveDefinitionObject;
});
angular.module('processbar.directive', []).directive('processbar', function () {
return {
restrict: 'EA',
replace: true,
transclude: true,
scope: {paramOne: '@paramOne', paramTwo: ':=paramTwo', paramThree: '¶mThree'},
template: "",
link: function (scope, element, attrs) {
}
};
});
类型
绑定策略
使用注意
paramOne
,则在调用该组件时该参数应该写为param-one
{{xxx}}
等{paramOne: '@paramOne'}
,则如果paramOne有值,则可以通过scope.paramOne
直接访问=
绑定操作符,绑定父容器scope域中的某个值,在指令中通过watch
函数来监听其值的变化,继而做出不同的处理。使用=
绑定符时,不要求参数名称与主容器scope域中的参数名称相同scope
参数中使用=
引入父容器的属性,进而使用watch
函数对比进行监听,如:scope: {currentPage: "=currentPage"}
scope.$watch('currentPage', function (newValue, oldValue) {
console.info("监听到了" + newValue);
});
myModule.factory('myInterceptor', function($q, notifyService, errorLog){
return function(promise){
return promise.then(function(response){
//响应正常,不用处理
return response;
}, function(response){
//进行错误处理
//最后返回
return $q.reject(response);
})
}
});
根据响应码进行处理
if (response.status === 401) {
$rootScope.$broadcast('errorResponse', response.data);
$window.location.href = ".";
} else if (response.status === 403) {
$rootScope.$broadcast('errorResponse', response.data);
alertException(response.data);
} else if (response.status === 404) {
$rootScope.$broadcast('errorResponse', response.data);
alert("未找到对应链接,或访问服务器失败");
} else if (response.status === 405) {
$rootScope.$broadcast('errorResponse', response.data);
} else if (response.status === 415) {
$rootScope.$broadcast('errorResponse', response.data);
} else if (response.status === 500) {
$rootScope.$broadcast('errorResponse', response.data);
}
main.html
<body ng-app="testApp" >
<div>
1213132
div>
<div ng-include="'module/navPage.html'"> div>
<script src="/TestMaven/js/customJS/test.js">script>
<script src="/TestMaven/js/customJS/navCtr.js">script>
body>
navPage.html
<div ng-controller='navController'>
<table>
<tr>
<td>业务类型td>
<td>全部td>
<td>网页浏览td>
tr>
<tr>
<td>指标td>
<td>指标1td>
<td>指标2td>
tr>
table>
div>
test.js
angular.module('testApp',['navApp']).controller('testController',function($scope){
});
navCtr.js
angular.module('navApp',[]).controller('navController',function($scope){
console.info("测试");
});