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 设为首页与加入收藏兼容多浏览器代码
Jan 11 Javascript
JS Map 和 List 的简单实现代码
Jul 08 Javascript
JQuery打造省市下拉框联动效果
May 18 Javascript
js控制多图左右滚动切换效果代码分享
Aug 26 Javascript
jquery.cookie.js实现用户登录保存密码功能的方法
Apr 15 Javascript
原生js三级联动的简单实现代码
Jun 07 Javascript
Angularjs实现带查找筛选功能的select下拉框示例代码
Oct 04 Javascript
微信小程序 页面跳转传参详解
Oct 28 Javascript
jQuery pjax 应用简单示例
Sep 20 jQuery
javascript写一个ajax自动拦截并下载数据代码实例
Sep 07 Javascript
vue实现在线翻译功能
Sep 27 Javascript
vue watch监控对象的简单方法示例
Jan 07 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分页显示制作详细讲解
2006/10/09 PHP
透析PHP的配置文件php.ini
2006/10/09 PHP
php实现文件编码批量转换
2014/03/10 PHP
PHP中使用BigMap实例
2015/03/30 PHP
基于PHP制作验证码
2016/10/12 PHP
PHP面向对象自动加载机制原理与用法分析
2016/10/14 PHP
详解PHP多个进程配合redis的有序集合实现大文件去重
2019/03/06 PHP
JS类定义原型方法的两种实现的区别评论很多
2007/09/12 Javascript
JavaScript中的事件处理
2008/01/16 Javascript
jQuery 树形结构的选择器
2010/02/15 Javascript
预加载css或javascript的js代码
2010/04/23 Javascript
JS 实现完美include载入实现代码
2010/08/05 Javascript
javascript确认框的三种使用方法
2013/12/17 Javascript
js中的时间转换—毫秒转换成日期时间的示例代码
2014/01/26 Javascript
深入分析Cookie的安全性问题
2015/03/01 Javascript
js 将input框中的输入自动转化成半角大写(税号输入框)
2017/02/16 Javascript
seajs实现强制刷新本地缓存的方法分析
2017/10/16 Javascript
nodejs中的异步编程知识点详解
2021/01/17 NodeJs
js实现简单商品筛选功能
2021/02/02 Javascript
Python模块WSGI使用详解
2018/02/02 Python
python读取word文档,插入mysql数据库的示例代码
2018/11/07 Python
python实现可逆简单的加密算法
2019/03/22 Python
windows10环境下用anaconda和VScode配置的图文教程
2020/03/30 Python
详解python 内存优化
2020/08/17 Python
Lou & Grey美国官网:主打舒适性面料服饰
2017/12/21 全球购物
Top Villas美国:豪华别墅出租和度假屋
2018/07/10 全球购物
竞聘演讲稿
2014/04/24 职场文书
感情真挚的毕业生求职信
2014/07/19 职场文书
个人授权委托书格式
2014/08/30 职场文书
中学生清明节演讲稿
2015/03/18 职场文书
2015年扫黄打非工作总结
2015/05/13 职场文书
新员工试用期工作总结2015
2015/05/28 职场文书
付款证明模板
2015/06/19 职场文书
坚持不是死撑,更重要的是心态
2019/08/19 职场文书
一文搞懂redux在react中的初步用法
2021/06/09 Javascript
JavaScript中MutationObServer监听DOM元素详情
2021/11/27 Javascript