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 相关文章推荐
jquery JSON的解析方式
Jul 25 Javascript
JavaScript 匿名函数(anonymous function)与闭包(closure)
Oct 04 Javascript
javascript数字格式化通用类 accounting.js使用
Aug 24 Javascript
Node.js 制作实时多人游戏框架
Jan 08 Javascript
js实现的倒计时按钮实例
Jun 24 Javascript
jQuery实现输入框邮箱内容自动补全与上下翻动显示效果【附demo源码下载】
Sep 20 Javascript
JS/jQuery判断DOM节点是否存在的简单方法
Nov 24 Javascript
js原生代码实现轮播图的实例讲解
Jul 28 Javascript
微信小程序实现打开内置地图功能【附源码下载】
Dec 07 Javascript
JavaScript判断日期时间差的实例代码
Mar 01 Javascript
vue项目中使用Hbuilder打包app 设置沉浸式状态栏的方法
Oct 22 Javascript
Vue打包部署到Nginx时,css样式不生效的解决方式
Aug 03 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 模拟get_headers函数的代码示例
2013/04/27 PHP
php获取文件夹路径内的图片以及分页显示示例
2014/03/11 PHP
thinkphp备份数据库的方法分享
2015/01/04 PHP
PHP结合Vue实现滚动底部加载效果
2017/12/17 PHP
PHP基于面向对象实现的留言本功能实例
2018/04/04 PHP
PHP PDOStatement::fetchAll讲解
2019/01/31 PHP
JavaScript入门教程(12) js对象化编程
2009/01/31 Javascript
javascript操作符&quot;!~&quot;详解
2015/02/10 Javascript
js控制页面的全屏展示和退出全屏显示的方法
2015/03/10 Javascript
js实现简单的左右两边固定广告效果实例
2015/04/10 Javascript
JS实现的网页背景闪电闪烁效果代码
2015/10/17 Javascript
AngularJS教程 ng-style 指令简单示例
2016/08/03 Javascript
详解AngularJs中$sce与$sceDelegate上下文转义服务
2016/09/21 Javascript
AngularJS实现根据变量改变动态加载模板的方法
2016/11/04 Javascript
JavaScript中三种常见的排序方法
2017/02/24 Javascript
JS库之wow.js使用方法
2017/09/14 Javascript
echarts实现地图定时切换散点与多图表级联联动详解
2018/08/07 Javascript
vue将单页面改造成多页面应用的方法
2018/11/25 Javascript
微信小程序发送短信验证码完整实例
2019/01/07 Javascript
[01:02:34]TFT vs VGJ.T Supermajor 败者组 BO3 第二场 6.5
2018/06/06 DOTA
rhythmbox中文名乱码问题解决方法
2008/09/06 Python
Python单例模式实例分析
2015/01/14 Python
VScode编写第一个Python程序HelloWorld步骤
2018/04/06 Python
python微元法计算函数曲线长度的方法
2018/11/08 Python
对python中Json与object转化的方法详解
2018/12/31 Python
django 快速启动数据库客户端程序的方法示例
2019/08/16 Python
简单分析python的类变量、实例变量
2019/08/23 Python
python实现MySQL指定表增量同步数据到clickhouse的脚本
2021/02/26 Python
介绍一下linux文件系统分配策略
2012/11/17 面试题
数据员岗位职责
2013/11/19 职场文书
服装设计专业求职信
2014/06/16 职场文书
高效课堂标语
2014/06/26 职场文书
家具商场的活动方案
2014/08/16 职场文书
2014年教育教学工作总结
2014/11/13 职场文书
本科毕业答辩开场白
2015/05/27 职场文书
关于Spring配置文件加载方式变化引发的异常详解
2022/01/18 Java/Android