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_03(ExtJs Grid的简单使用)
Oct 02 Javascript
javascript oop开发滑动(slide)菜单控件
Aug 25 Javascript
简略的前端架构心得&amp;&amp;基于editor为例子的编码小技巧
Nov 25 Javascript
JSON为什么那样红为什么要用json(另有洞天)
Dec 26 Javascript
Jquery图片滚动与幻灯片的实例代码
Apr 08 Javascript
Javascript实现Array和String互转换的方法
Dec 21 Javascript
javascript实现2016新年版日历
Jan 25 Javascript
js 判断数据类型的几种方法
Jan 13 Javascript
jQuery实现的简单手风琴效果示例
Aug 29 jQuery
AngularJS上传文件的示例代码
Nov 10 Javascript
js实现批量删除功能
Aug 27 Javascript
通过实例解析json与jsonp原理及使用方法
Sep 27 Javascript
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图片处理之使用imagecopyresampled函数实现图片缩放例子
2014/11/19 PHP
php简单实现数组分页的方法
2016/04/30 PHP
适合PHP初学者阅读的4本经典书籍
2016/09/23 PHP
DEDE实现转跳属性文档在模板上调用出转跳地址
2016/11/04 PHP
php中通过eval实现字符串格式的计算公式
2017/03/18 PHP
Laravel框架分页实现方法分析
2018/06/12 PHP
extjs中grid中嵌入动态combobox的应用
2011/01/01 Javascript
javascript两种function的定义介绍及区别说明
2013/05/02 Javascript
js confirm()方法的使用方法实例
2013/07/13 Javascript
jquery form表单序列化为对象的示例代码
2014/03/05 Javascript
基于Javascript实现倒计时功能
2016/02/22 Javascript
基于Bootstrap实现Material Design风格表单插件 附源码下载
2016/04/18 Javascript
AngularJS表单验证中级篇(3)
2016/09/28 Javascript
DOM 事件的深入浅出(二)
2016/12/05 Javascript
js实现图片360度旋转
2017/01/22 Javascript
微信小程序自定义组件
2017/08/16 Javascript
jQuery实现的简单图片轮播效果完整示例
2018/02/08 jQuery
关于Mac下安装nodejs、npm和cnpm的教程
2018/04/11 NodeJs
AngularJs中$cookies简单用法分析
2019/05/30 Javascript
微信小程序关键字变色实现代码实例
2019/12/13 Javascript
Python遍历目录的4种方法实例介绍
2015/04/13 Python
python 3.6 tkinter+urllib+json实现火车车次信息查询功能
2017/12/20 Python
Python三种遍历文件目录的方法实例代码
2018/01/19 Python
对pandas数据判断是否为NaN值的方法详解
2018/11/06 Python
Python 利用邮件系统完成远程控制电脑的实现(关机、重启等)
2019/11/19 Python
Python第三方包之DingDingBot钉钉机器人
2020/04/09 Python
Python类中的装饰器在当前类中的声明与调用详解
2020/04/15 Python
python利用xlsxwriter模块 操作 Excel
2020/10/14 Python
Django通过设置CORS解决跨域问题
2020/11/26 Python
基于html5 canvas做批改作业的小插件
2020/05/20 HTML / CSS
阿里巴巴英国:Alibaba英国
2019/12/11 全球购物
傲盾软件面试题
2015/08/17 面试题
高中毕业生登记表自我鉴定范文
2014/03/18 职场文书
见习期自我鉴定范文
2014/03/19 职场文书
2015年仓库工作总结
2015/04/09 职场文书
「玫瑰之王的葬礼」舞台剧主视觉图公开
2022/03/21 日漫