angularjs诞生于2009年,由Misko Hevery等人建立,后为Google所收购。是一款优秀的前端JS框架。已经被用于Google的多款产品中。 angularjs有着诸多特性,最为核心的是:MVVM、模块化、自动化双向数据绑定、语义化标签、依赖注入等等。 目前AgularJS应用很是普遍国内比较大型的公司如阿里云、腾讯都在使用。php
http://angularjs.org 文档查看 http://docs.angularjs.cn/api 调试工具 batarang 主要功能: 查看做用域、输出调试信息、性能监控 安装:https://pan.baidu.com/s/1jGILtzgcss
<html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> <script src="../../org/angular.min.js"></script> </head> <body> <div ng-app="app" ng-controller="ctrl"> {{name}} <!--双向数据绑定--> <input type="text" name="" id="" ng-model="name"> </div> <script> // 注册模块m var m = angular.module('app', []); //注册控制器ctrl m.controller('ctrl', ['$scope', function($scope) { //$scope 视图模型 $scope.name = '老周'; }]) </script> </body> </html>
<script>
// 模块名 依赖的模块
var m = angular.module('app', []);
// 规范依赖注入写法-避免代码压缩后出问题
// m.controller('ctrl', ['$scope', function($scope) {
// $scope.name = '老周';
// }])
// a能够随便变,由于是按前面$scope注入的,由于字符串是不会被压缩的
m.controller('ctrl', ['$scope', function(a) {
a.name = '周宇翔';
}])
</script>
原理:页面会先解析css样式,而后angular在进行处理。因此内容会被先隐藏,angular解析完以后才会显示 display:block。这个过程angular自动处理。html
样式表中增长样式 .ng-cloak前端
.ng-cloak{
display:none;
}
标签上增长 ng-cloak属性 和 ng-cloak的classjquery
<div ng-cloak class="ng-cloak">{{name}}</div>
当点击submit提交的时候,提交的是value中的数据,仍然会有空格,可是$scope中的数据通过 trim处理以后,没有空格了。
十7、ng-if、ng-show、ng-disable、ng-init实现网站注册协议设置 016
- ng-show : 使用css display:none display:block 控制
- ng-if: 移除和添加dom节点的方式控制显示隐藏
$evengit
<li ng-repeat="(k,v) in data">
重复数据出错--track by $indexangularjs
$scope.data = ['qq','百度','qq']
<li ng-repeat="(k,v) in data track by $index">
ng-model-optionsweb
失去焦点更新:chrome
<input type="text" ng-model="data" ng-model-options="{updateOn:'blur'}"/> {{data}}
三秒后更新:json
<input type="text" ng-model="data" ng-model-options="{debounce:3000}"/> {{data}}
三秒后更新或失去焦点更新:
<input type="text" ng-model="title" ng-model-options="{updateOn:'default blur',debounce:{default:3000,blur:0}}"/> {{title}}
ng-class-odd ng-class-even
过滤器: 对数据进行二次处理
currency:金钱修饰符,四舍五入
<span>{{price|currency:'¥':1}}</span>
number: 数字处理,保留几位小数点,四舍五入
<span>{{price|number:2}}</span>
lowercase:转小写
<p>{{city|lowercase}}</p>
uppercase:转大写
<p>{{name|uppercase}}</p>
limitTo: 截取几个字符
<p>{{title|limitTo:3}}</p>
date: 日期过滤器
<p>{{time|date:'yy-MM-dd HH:mm:ss'}}</p>
orderBy:'排序字段':升降序 true/false
<div>{{data|orderBy:'id':true}}</div>
filter:过滤字符:是否彻底匹配
<!-- 不传第二个参数,无论哪一个值含有3都算 -->
<div>{{data|filter:'3'}}</div>
<!-- 第二个参数true彻底匹配 -->
<div>{{data|filter:3:true}}</div>
$scope.orderBy = function(field) {
if (arguments.callee[field] == undefined) {
arguments.callee[field] = false;
}
arguments.callee[field] = !arguments.callee[field];
$scope.data = $filter('orderBy')($scope.data, field, arguments.callee[field]);
}
$scope.status = {
id: false,
title: false,
age: false
};
$scope.orderBy = function(field) {
$scope.status[field] = !$scope.status[field];
$scope.data = $filter('orderBy')($scope.data, field, $scope.status[field]);
}
监听普通变量
新数据 旧数据
$scope.$watch('title', function(newData, oldData) {
$scope.error = $scope.title.length > 3 ? '标题长度不能超过三个' : '';
})
监听对象:第三个参数true必须写
$scope.data = {
title: ''
};
$scope.$watch('data', function(newData, oldData) {
$scope.error = newData.title.length > 3 ? '标题长度不能超过三个' : '';
}, true)
//排序显示数据临时变量
$scope.lists = $scope.data;
$scope.$watch('search', function(n, o) {
$scope.lists = $filter('filter')($scope.data, n);
})
/html
<td>{{u.phone|truncate:3}}</td>
/js
var m = angular.module('app', []);
m.filter('truncate', function() {
return function(str, len) {
return str.substr(0, 11 - len) + new String('*').repeat(3);
}
})
shiy
/html
<div zyx></div>
<zyx></zyx>
<div class="zyx"></div>
/js
var m = angular.module('app', []);
m.directive('zyx', [function() {
return {
restrict: 'AEC',//A attr-属性 E-element 元素标签 C-class 类名
template: 'angular学习'
}
}])
angular自有指令都是 ng-开头的,那咱们自定义的指令也保持这种风格,但不要使用ng-,可使用如 zyx- jy-等。那么在命名的时候须要使用驼峰命名法。代码以下
/html
<zyx-show></zyx-show>
/js
var m = angular.module('app', []);
m.directive('zyxShow', [function() {
return {
restrict: 'E',//A attr-属性 E-element 元素标签 C-class 类名
template: 'angular学习'
}
}])
<body ng-app="app" ng-controller="ctrl">
<jy-show color="red">这里是文字</jy-show>
<script>
var m = angular.module('app', []);
m.directive('jyShow', [function() {
return {
restrict: 'E',
template: function(elem, attr) { //elem是当前元素标签的angular对象能够引入jquery用$()包裹,而后用jquery中的方法,attr是属性集合
// console.log(elem, attr);
//return 123; //返回什么内容就是什么;
// return $(elem).html();
return "<span style='color:" + attr.color + "'>" + $(elem).html() + "</span>"
}
}
}])
m.controller('ctrl', ['$scope', function($scope) {
$scope.name = '老周';
}])
</script>
</body>
var m = angular.module('app', []);
m.directive('jyShow', [function() {
return {
restrict: 'E',
template: '<span>这是模板内容</span>',
replace: true //true:将template中的内容替换指令所在位置,false嵌入指令内
}
}])
transclude/ng-transclude
<jy-cms>这里是指令标签内的内容</jy-cms>
<script>
var m = angular.module('app', []);
m.directive('jyCms', [function() {
return {
restrict: 'E',
template: '<div><p ng-transclude=""></p>今每天气不错</div>',
transclude: true //true时,会将标签指令中的内容替换掉 ng-transclude所在标签的位置
}
}])
m.controller('ctrl', ['$scope', function($scope) {
$scope.name = '老周';
}])
</script>
templateUrl
/view/jsCms.html
<div>
这里是templateUrl指定的模板内容
</div>
/2.html
<jy-cms>这里是指令标签内的内容</jy-cms>
<script>
var m = angular.module('app', []);
m.directive('jyCms', [function() {
return {
restrict: 'E',
templateUrl: './view/jyCms.html', //想要正常打开,须要在localhost的方式访问(启动phpstudy),不能直接打开静态文静的方式引入
replace: true //使用replacetrue的前提是,templateUrl模板中的内容,必须包在一个块标签内
}
}])
m.controller('ctrl', ['$scope', function($scope) {
$scope.name = '老周';
}])
</script>
总结:用 = 能够调用父级做用域中的变量。用&符能够调用父级做用域中的方法。
详见 041用法
// 原生方法会触发angular的脏检查机制,让修改后的数据更新,不是绑定在$scope下的方法虽然数据已经被修改了,可是没有触发脏检查机制,致使视图没有更新,想要更新视图,须要单独调用$scope.$apply() 触发脏检查机制更新视图
$scope.change = function() {
$scope.name = '积云教育';
}
$('#jq').click(function() {
$scope.name = 'jquery修改生效';
$scope.$apply();
就是对原生window对象的angular封装,目的跟timeout等同样,触发视图更新
带有元素标签的数据,标签不能再页面正常解析,都会自动转实体。因此要想正常解析须要两点
建立缓存仓库
var store = $cacheFactory('store');
获取建立的缓存仓库
var obj = $cacheFactory.get('store');
销毁缓存仓库
store.destroy();
缓存数据
store.put('web', {
'title': '腾讯能视频',
url: 'www.qq.com'
});
读取缓存数据
store.get('web')
删除缓存数据
// store.remove('web');//按名删
// store.removeAll();//全删
// store.destroy();//把缓存仓库也删掉
$http({
url: '1.php',
method: 'get'
}).then(function(res) {
$scope.data = res.data;
}).then(function(error) {
console.log(error)
})
在配置中加入 cache: true 那么就会将上次请求回来的数据缓存,不会重复发请求。查看chrome浏览器的network能够看到之请求了一次1.php
$http.get('1.php',{cache:true}).then(function(res) {
$scope.data = res.data;
}).then(function(error) {
console.log(error)
})
m.service('webService', ['$http', function($http) {
this.get = function() {
return $http.get('1.php', {
cache: true
}).then(function(res) {
return res.data;
})
}
}])
<div ui-view></div>
===js===
var m = angular.module('app', ['ui.router']);
m.config(['$stateProvider', '$urlRouterProvider', function($stateProvider, $urlRouterProvider) {
//默认路由
$urlRouterProvider.otherwise('/index');
//定义路由规则
$stateProvider.state('default', {
url: '/index',
template: '<h1>laozhou</h1>'
})
}])
====html====
<a ui-sref="index">首页</a>
<a ui-sref="home">家目录</a>
<a href="#/list">列表页</a>
<div ui-view>访问不存在的路由时,显示以下提示信息</div>
====js=====
var m = angular.module('app', ['ui.router']);
m.config(['$stateProvider', '$urlRouterProvider', function($stateProvider, $urlRouterProvider) {
//默认路由
$urlRouterProvider.otherwise('/index');
//定义路由规则
$stateProvider
.state('default', {
url: '/index',
template: '<h1>首页</h1>'
})
.state('home', {
url: '/home',
template: '<h1>家目录</h1>'
})
.state('list', {
url: '/list',
template: '<h1>列表页</h1>'
})
}])
.state('home', {
url: '/home',
templateUrl: './view/home.html'
})