angularjs之$timeout指令详解


Posted in Javascript onJune 13, 2017

angular.js的$timeout指令对window.setTimeout做了一个封装,它的返回值是一个promise对象.当定义的时间到了以后,这个promise对象就会被resolve,回调函数就会被执行.

如果需要取消一个timeout,调用$timeout.cancel(promise)方法.

用法:

$timeout(fn, [delay], [invokeApply]);

fn: 回调函数(必填)

delay: number类型.延迟的时间(非必填),如果不填,表示等线程空下来以后就执行.比如当页面被渲染完成后.

invokeApply: 布尔值.是否需要进行脏值检测(非必填),不填默认为false,如果设置为true,则fn回调会被包在$scope.$apply()中执行

返回值: 返回一个promise对象.当定义的时间到了以后,这个promise对象就会被resolve.resolve的值就是fn回调函数的返回值

方法:

$timeout.cancel([promise])

promise: 一个由$timeout()所创建的promise对象.(非必填).调用cancel()以后,这个promise对象就会被reject.

返回值: 如果$timeout()的回调还没有被执行,那就取消成功.返回true

下面来简单的测试一下:

var timeoutApp = angular.module('timeoutApp',[]);
   timeoutApp.run(function($timeout){
     var a = $timeout(function(){
       console.log('执行$timeout回调');
       return 'angular'
     },1000);
     a.then(function(data){
       console.log(data)
     },function(data){
       console.log(data)
     });
     //$timeout.cancel(a);
   })

运行以后看到控制台打印:

执行$timeout回调
angular

如果我打开注释,执行.cancel()方法,那么$timeout的回调就不会被执行,它返回的promise被reject,控制台打印:

canceled

下面做个很实用的小demo: 延迟下拉菜单: 鼠标放到button上的时候,延迟500毫秒显示下拉菜单,当鼠标离开button的时候,延迟500毫秒隐藏下拉菜单,如果鼠标是进入了下拉菜单部分,那么就不隐藏下拉菜单.如果鼠标离开了下拉菜单,延迟500毫秒隐藏下拉菜单,如果鼠标是进入了button,那么还是不隐藏下拉菜单

html:

<!DOCTYPE html>
<html ng-app="timeoutApp">
<head>
  <title>$timeout服务</title>
  <meta charset="utf-8">
  <link rel="stylesheet" href="../bootstrap.css" rel="external nofollow" />
  <script src="../angular.js"></script>
  <script src="script.js"></script>
  <style type="text/css">
  * {
   font-family:'MICROSOFT YAHEI'
  }
  </style>
</head>
<body >

 <div ng-controller="myCtrl">
   <div class="dropdown" dropdown >
     <button class="btn btn-default dropdown-toggle" type="button" ng-mouseenter = "showMenu()" ng-mouseleave = "hideMenu()">
       Dropdown
       <span class="caret"></span>
     </button>
     <ul class="dropdown-menu" ng-show="ifShowMenu" ng-mouseenter = "showMenu()" ng-mouseleave = "hideMenu()">
       <li><a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >Action</a></li>
       <li><a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >Another action</a></li>
       <li><a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >Something else here</a></li>
       <li><a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >Separated link</a></li>
     </ul>
   </div>
 </div>

</body>
</html>

js: 

var timeoutApp = angular.module('timeoutApp',[]);
timeoutApp.controller('myCtrl',function($scope){
  $scope.ifShowMenu = false;
});
timeoutApp.directive('dropdown',function($timeout){
  return {
    restrict:"EA",
    link:function(scope,iele,iattr){
      scope.showMenu = function(){
        $timeout.cancel(scope.t2);
        scope.t1 = $timeout(function(){
          scope.ifShowMenu = true
        },500)
      };
      scope.hideMenu = function(){
        $timeout.cancel(scope.t1);
        scope.t2 = $timeout(function(){
          scope.ifShowMenu = false
        },500)
      };
    }
  }
})

代码应该很好理解: 就是进入button和进入ul下拉菜单的时候,都定义一个timeout回调(过500毫秒以后显示下拉菜单),同时取消隐藏下拉菜单的回调.而离开button和ul的时候相反.

代码地址: https://github.com/OOP-Code-Bunny/angular/tree/master/%24timeout

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

Javascript 相关文章推荐
javascript 动态设置已知select的option的value值的代码
Dec 16 Javascript
用于节点操作的API,颠覆原生操作HTML DOM节点的API
Dec 11 Javascript
JQuery操作tr和td内容的方法实例
Mar 06 Javascript
JS获得QQ号码的昵称,头像,生日的简单实例
Dec 04 Javascript
Eclipse编辑jsp、js文件时卡死现象的解决办法汇总
Feb 02 Javascript
BootStrap中Tab页签切换实例代码
May 30 Javascript
jquery append与appendTo方法比较
May 24 jQuery
浅谈vue的props,data,computed变化对组件更新的影响
Jan 16 Javascript
微信小程序动画(Animation)的实现及执行步骤
Oct 28 Javascript
vuex如何重置所有state(可定制)
Jan 17 Javascript
javascript将16进制的字符串转换为10进制整数hex
Mar 05 Javascript
vue使用watch监听属性变化
Apr 30 Vue.js
JS实现json的序列化和反序列化功能示例
Jun 13 #Javascript
angularjs实现搜索的关键字在正文中高亮出来
Jun 13 #Javascript
angular-ngSanitize模块-$sanitize服务详解
Jun 13 #Javascript
让微信小程序支持ES6中Promise特性的方法详解
Jun 13 #Javascript
jQueryeasyui 中如何使用datetimebox 取两个日期间相隔的天数
Jun 13 #jQuery
Javascript实现的StopWatch功能示例
Jun 13 #Javascript
原生JS实现图片懒加载(lazyload)实例
Jun 13 #Javascript
You might like
实例讲解PHP面向对象之多态
2014/08/20 PHP
两个php日期控制类实例
2014/12/09 PHP
深入理解PHP中的count函数
2016/05/31 PHP
Yii2.0实现生成二维码功能实例
2017/10/24 PHP
作为PHP程序员你要知道的另外一种日志
2018/07/30 PHP
jquery tools 系列 scrollable学习
2009/09/06 Javascript
利用js(jquery)操作Cookie的方法说明
2013/12/19 Javascript
Jquery实现的一种常用高亮效果示例代码
2014/01/28 Javascript
JS获取当前脚本文件的绝对路径
2016/03/02 Javascript
AngularJS 中的指令实践开发指南(一)
2016/03/20 Javascript
跨域请求的完美解决方法(JSONP, CORS)
2016/06/12 Javascript
基于jquery实现二级联动效果
2017/03/30 jQuery
深入理解vuex2.0 之 modules
2017/11/20 Javascript
小程序实现带年月选取效果的日历
2018/06/27 Javascript
Bootstrap Fileinput 4.4.7文件上传实例详解
2018/07/25 Javascript
vue观察模式浅析
2018/09/25 Javascript
JavaScript实现图片伪异步上传过程解析
2020/04/10 Javascript
[01:42:49]DOTA2-DPC中国联赛 正赛 iG vs PSG.LGD BO3 第一场 2月26日
2021/03/11 DOTA
Python之eval()函数危险性浅析
2014/07/03 Python
python实现随机森林random forest的原理及方法
2017/12/21 Python
使用python 写一个静态服务(实战)
2019/06/28 Python
python操作链表的示例代码
2020/09/27 Python
html5 移动端视频video的android兼容(去除播放控件、全屏)
2020/03/26 HTML / CSS
韩国三星集团旗下时尚品牌官网:SSF SHOP
2016/08/02 全球购物
您附近的水疗和健康场所:Spafinder(美国)
2019/07/05 全球购物
什么是WEB控件?使用WEB控件有哪些优势?
2012/01/21 面试题
小学生成长感言
2014/01/30 职场文书
《哪吒闹海》教学反思
2014/02/28 职场文书
委托书样本
2014/04/02 职场文书
法制演讲稿
2014/09/10 职场文书
2014年党员整改措施
2014/10/24 职场文书
实习指导教师评语
2014/12/30 职场文书
入党积极分子半年考察意见
2015/06/02 职场文书
2016年第32个教师节致辞
2015/11/26 职场文书
如何拟写通知正文?
2019/04/02 职场文书
海康机器人重磅发布全新算法开发平台VM4.2
2022/04/21 数码科技