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 相关文章推荐
学习YUI.Ext 第六天--关于树TreePanel(Part 1)
Mar 10 Javascript
javascript 面向对象全新理练之继承与多态
Dec 03 Javascript
基于jquery的has()方法以及与find()方法以及filter()方法的区别详解
Apr 26 Javascript
JS获取下拉列表所选中的TEXT和Value的实现代码
Jan 11 Javascript
jQuery控制元素显示、隐藏、切换、滑动的方法总结
Apr 16 Javascript
小心!AngularJS结合RequireJS做文件合并压缩的那些坑
Jan 09 Javascript
Javascript之Math对象详解
Jun 07 Javascript
jquery mobile 实现自定义confirm确认框效果的简单实例
Jun 17 Javascript
AngularJS基础 ng-csp 指令详解
Aug 01 Javascript
微信小程序-获得用户输入内容
Feb 13 Javascript
Node.js中 __dirname 的使用介绍
Jun 19 Javascript
浅谈Vue的加载顺序探讨
Oct 25 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编程函数安全篇
2013/01/08 PHP
PHP自定义函数实现数组比较功能示例
2017/10/19 PHP
在Laravel的Model层做数据缓存的实现
2019/09/26 PHP
基于JQuery.timer插件实现一个计时器
2010/04/25 Javascript
利用json获取字符出现次数的代码
2012/03/22 Javascript
在Google 地图上实现做的标记相连接
2015/01/05 Javascript
JavaScript数组和循环详解
2015/04/27 Javascript
Javascript的表单验证-初识正则表达式
2016/03/18 Javascript
Bootstrap学习笔记之css样式设计(1)
2016/06/07 Javascript
JS实现弹出下载对话框及常见文件类型的下载
2017/07/13 Javascript
你点的 ES6一些小技巧,请查收
2018/04/25 Javascript
手把手教你 CKEDITOR 4 实现Dialog 内嵌 IFrame操作详解
2019/06/18 Javascript
JavaScript:ES2019 的新特性(译)
2019/08/08 Javascript
小程序识别身份证,银行卡,营业执照,驾照的实现
2019/11/05 Javascript
Python字典实现简单的三级菜单(实例讲解)
2017/07/31 Python
Django model序列化为json的方法示例
2018/10/16 Python
使用Python实现企业微信的自动打卡功能
2019/04/30 Python
python图片指定区域替换img.paste函数的使用
2020/04/09 Python
2020最新pycharm汉化安装(python工程狮亲测有效)
2020/04/26 Python
使用Python将语音转换为文本的方法
2020/08/10 Python
英国最大的运动营养公司之一:LA Muscle
2018/07/02 全球购物
亚马逊墨西哥站:Amazon.com.mx
2018/08/26 全球购物
ZINVO手表官网:男士和女士手表
2019/03/10 全球购物
linux比较文件内容的命令是什么
2015/09/23 面试题
前台接待的工作职责
2013/11/21 职场文书
仓库管理员岗位职责
2014/03/19 职场文书
《记金华的双龙洞》教学反思
2014/04/19 职场文书
《晚上的太阳》教学反思
2014/04/23 职场文书
“向国旗敬礼”活动策划方案(4篇)
2014/09/27 职场文书
2014年村党支部工作总结
2014/12/04 职场文书
复兴之路展览观后感
2015/06/02 职场文书
2016国庆节67周年寄语
2015/12/07 职场文书
《水上飞机》教学反思
2016/02/20 职场文书
标会主持词应该怎么写?
2019/08/15 职场文书
golang DNS服务器的简单实现操作
2021/04/30 Golang
Element实现动态表格的示例代码
2021/08/02 Javascript