Angular ng-animate和ng-cookies用法详解


Posted in Javascript onApril 18, 2018

ng-animate

本文讲一下Angular中动画应用的部分。

首先,Angular本生不提供动画机制,需要在项目中加入Angular插件模块ngAnimate才能完成Angular的动画机制,Angular也不提供具体的动画样式,所以说,它的自由度和可定制性挺大的。

那么,刚开始需要在项目的入口html文件中引入Angular框架(angular.js),然后引入angular.animate.js。

在项目的js入口文件app.js中,新建项目模块,并且添加所依赖的模块ng-Animate(有其他需要的模块的话也可以引入,顺序没关系)

var demoApp = angular.module('demoApp', ['ngAnimate','ui.router']);

这里中间插入一句,建议Angular中的依赖注入用如下模式,在ads、bds或者其他的前端自动化工具打包压缩后不会产生问题,因为仅仅通过 给function传参的形式注入依赖,Angular是会对注入的变量名有严格的要求(如$scope变量名在控制器中注入时变量名只能 写$scope):

//控制器.js、指令.js、过滤器.js的依赖注入建议都用这种方式写
//这是ui-route的配置,在app.js
demoApp.config(['$stateProvider', '$urlRouterProvider',function($stateProvider, $urlRouterProvider){
 // your code.
}]);

好了,回到正题上。引入了ngAnimate之后,Angular的动画机制就能生效了。

Angular文档中写到如下指令和支持的动画

Angular ng-animate和ng-cookies用法详解

那么,怎么使用呢? 本文拿ng-repeat这个指令来做个介绍,其他的一些指令使用方式几乎相同,可类推。

ng-repeat 主要是对一个list的展示,这些元素是是被创建出来加入到DOM结构中去的,那么,它的动画过程为:

创建元素 -> .ng-enter -> .ng-enter-active -> 完成,呈默认状态

默认状态 -> .ng-leave -> .ng-leave-active -> 销毁元素

所以可以通过设置.ng-enter(.ng-leave) 和 .ng-enter-active(.ng-leave-active) 的样式,加上css3的动画来显示出动画,如:

<!-- HTML片段 -->
<div ng-init="users = [1,2,3,4,5]"></div>
<input class="filter-btn" type="search" ng-model="u" placeholder="search item" aria-label="search item" />
<ul>
<li class="item" ng-repeat="user in users | filter: u as result">
 {{user}}
</li>
</ul>
/* css片断 */
/*ng-repeat的元素*/
.item{
 -webkit-transition: all linear 1s;
 -o-transition: all linear 1s;
 transition: all linear 1s;
}
/*动画开始前*/
.item.ng-enter{
 opacity:0;
}
/*动画过程*/
.item-ng-enter-active{
 opacity:1;
}

这样的效果是对所有元素同时应用,可能实际运用中需要有一个先后的渐变出现的效果,这时候可以设置ng-enter-stagger来实现.

/*不同时出现*/

.item.ng-enter-stagger {

 transition-delay:0.5s;

 transition-duration:0s;

}

同样的,这些angular animate提供的动画的class也可以应用到页面切换中去。自定义动画(基于class)

 在添加移除class时自定义动画

.class-add     ->   .class-add-active  ->   .class

如果通过写css的方式还无法满足需求,当然,还可以通过JS的方式来控制动画,下面的代码你可以理解为是一个模版

/* CLASS 是需要应用的class名,handles是支持的操作,如下图所示*/
/* 这里如果是应用在ui-view 的class上,模版会叠加(坑)*/
demoApp.animation('.classname',function(){
return {
 'handles':function(element,className,donw){
  //... your code here
  //回调
  return function(cancelled){
  // alert(1);
  }
 }
 }
})

支持的操作:

Angular ng-animate和ng-cookies用法详解

ng-cookies

$cookies[name] = value;

这个是angular设置cookies方法

$cookieStore
提供一个被session cookies支持的键值对(字符串-对象)存储。被存入和取出的对象将自动通过angular的toJson/fromJson进行序列化/反序列化。

$cookies
提供浏览器cookies的读/写访问操作。

这两个都要引入ngCookies模块才能使用,这个模块在1.4版本之后就有了

从源码中得知$cookieStore返回了三个方法get put remove 他们分别用toJson/fromJson进行序列化/反序列化

简单的写了几个例子来测试下

<!DOCTYPE html>
<html ng-app="AutumnsWindsApp" ng-controller="aswController">
 <head>
  <meta charset="UTF-8">
  <title></title>
 </head>
 <script src="http://code.angularjs.org/1.2.9/angular.min.js"></script>
 <script src="http://code.angularjs.org/1.2.9/angular-cookies.min.js"></script>
<body>
  {{title}}
 </body>
 <script>
  var AutumnsWindsApp = angular.module('AutumnsWindsApp', ['ngCookies']);
  AutumnsWindsApp.controller('aswController', function($cookies, $cookieStore, $scope) {
   $cookies.name = 'autumnswind';
   $scope.title = "Hello, i'm autumnswind :)";
   $cookieStore.put("skill", "##");
   //删除cookies
   $cookieStore.remove("name");
   //设置过期日期
   var time = new Date().getTime() + 5000;
   $cookieStore.put("cookie", "Hello wsscat", {
    expires: new Date(new Date().getTime() + 5000)
   });

   $cookieStore.put("objCookie", {
    value: "wsscat cat cat",
    age: "3",
 }, {
  expires: new Date(new Date().getTime() + 5000)
   });
   console.log($cookies);
   console.log($cookies['objCookie']);
  })
 </script>
</html>

其实平时我们这样就可以把自己需要的cookies设置进去

$cookies.name = 'autumnswind';

但是当我们要设置一个有效时间的时候我们就用这样的方法把它设置进去

var time = new Date().getTime() + 5000;
   $cookieStore.put("cookie", "Hello wsscat", {
    expires: new Date(new Date().getTime() + 5000)
   });

我们还可以进行删除等操作

$cookieStore.remove("name");

补充:

ng-repeat-track by用法:

<div ng-repeat="links in slides">
 <div ng-repeat="link in links track by $index">{{link.name}}</div>
</div>

Error: [ngRepeat:dupes]这个出错提示具体到题主的情况,意思是指数组中有2个以上的相同数字。ngRepeat不允许collection中存在两个相同Id的对象

For example: item in items is equivalent to item in items track by $id(item). This implies that the DOM elements will be associated by item identity in the array.
对于数字对象来说,它的id就是它自身的值,因此,数组中是不允许存在两个相同的数字的。为了规避这个错误,需要定义自己的track by表达式。例如:

item in items track by item.id或者item in items track by fnCustomId(item)。
嫌麻烦的话,直接拿循环的索引变量$index来用item in items track by $index

自定义服务的区别:

factory()----函数可以返回简单类型、函数乃至对象等任意类型的数据 一般最为常用
service()-----函数数组、对象等数据
factory和service不同之处在于,service可以接收一个构造函数,当注入该服务时通过该函数并使用new来实例化服务对象

constant()----value()方法和constant()方法之间最主要的区别是,常量可以注入到配置函数中,而值不行,value可与你修改,constant不能修改

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript 事件系统
Jul 22 Javascript
JS数组的遍历方式for循环与for...in
Jul 31 Javascript
详解AngularJS实现表单验证
Dec 10 Javascript
JavaScript中无法通过div.style.left获取值的解决方法
Feb 19 Javascript
浅谈js函数三种定义方式 &amp; 四种调用方式 &amp; 调用顺序
Feb 19 Javascript
浅谈JavaScript正则表达式-非捕获性分组
Mar 08 Javascript
JS实现匀速与减速缓慢运动的动画效果封装示例
Aug 27 Javascript
JavaScript使用小插件实现倒计时的方法讲解
Mar 11 Javascript
原生js实现抽奖小游戏
Jun 27 Javascript
微信小程序实现滑动操作代码
Apr 23 Javascript
解决Vue keep-alive 调用 $destory() 页面不再被缓存的情况
Oct 30 Javascript
JavaScript实现点击出现子菜单效果
Feb 08 Javascript
JS实现的base64加密解密操作示例
Apr 18 #Javascript
JS实现简单获取最近7天和最近3天日期的方法
Apr 18 #Javascript
详解Node使用Puppeteer完成一次复杂的爬虫
Apr 18 #Javascript
jQuery滚动条美化插件nicescroll简单用法示例
Apr 18 #jQuery
Angular 如何使用第三方库的方法
Apr 18 #Javascript
jQuery实现的淡入淡出与滑入滑出效果示例
Apr 18 #jQuery
浅谈mvvm-simple双向绑定简单实现
Apr 18 #Javascript
You might like
PHP 中的一些经验积累
2006/10/09 PHP
简单的php数据库操作类代码(增,删,改,查)
2013/04/08 PHP
php视频拍照上传头像功能实现代码分享
2015/10/08 PHP
php微信浏览器分享设置以及回调详解
2016/08/01 PHP
用js的for循环获取radio选中的值
2013/10/21 Javascript
javascript写的一个模拟阅读小说的程序
2014/04/04 Javascript
实例详解jQuery Mockjax 插件模拟 Ajax 请求
2016/01/12 Javascript
创建基于Bootstrap的下拉菜单的DropDownList的JQuery插件
2016/06/02 Javascript
Jquery揭秘系列:ajax原生js实现详解(推荐)
2016/06/08 Javascript
js图片轮播手动切换特效
2017/01/12 Javascript
基于AGS JS开发自定义贴图图层
2017/03/31 Javascript
Vue代码分割懒加载的实现方法
2017/11/23 Javascript
AngularJs 禁止模板缓存的方法
2017/11/28 Javascript
微信小程使用swiper组件实现图片轮播切换显示功能【附源码下载】
2017/12/12 Javascript
JavaScript实现的超简单计算器功能示例
2017/12/23 Javascript
vue自定义filters过滤器
2018/04/26 Javascript
详解iview的checkbox多选框全选时校验问题
2019/06/10 Javascript
Element Notification通知的实现示例
2020/07/27 Javascript
Javascript实现关闭广告效果
2021/01/29 Javascript
Python中类型检查的详细介绍
2017/02/13 Python
python  文件的基本操作 菜中菜功能的实例代码
2019/07/17 Python
解决Python在导入文件时的FileNotFoundError问题
2020/04/10 Python
jupyter 使用Pillow包显示图像时inline显示方式
2020/04/24 Python
关于pycharm 切换 python3.9 报错 ‘HTMLParser‘ object has no attribute ‘unescape‘ 的问题
2020/11/24 Python
python爬虫实现爬取同一个网站的多页数据的实例讲解
2021/01/18 Python
Python 中如何使用 virtualenv 管理虚拟环境
2021/01/21 Python
使用css3制作动感导航条示例
2014/01/26 HTML / CSS
html5声频audio和视频video等新特性详细说明
2012/12/26 HTML / CSS
html5将图片转换成base64的实例代码
2016/09/21 HTML / CSS
HTML5实现文件断点续传的方法
2017/01/04 HTML / CSS
SOA面试题:如何在SOA中实现松耦合
2013/07/21 面试题
应届生骨科医生求职信
2013/10/31 职场文书
律师授权委托书范本
2014/10/07 职场文书
2015年重阳节慰问信
2015/03/23 职场文书
KTV员工管理制度
2015/08/06 职场文书
Redis Cluster 集群搭建你会吗
2021/08/04 Redis