鄙人来本公司前未用过ionic框架,但由于ionic是基于angularjs封装的,正好我用过angularjs,很荣幸的面试就过了,然后通过该网站http://www.ionic.wang(后面简称网站i)边学ionic边做项目。

  ionic刚踩过的坑--$ionicGesture!现总结下$ionicGesture,希望对用到该框架的童鞋有所帮助!

  网站i对$ionicGesture的介绍如下:

  在一个元素上添加一个事件监听器。

$ionicGesture.on(eventType, callback, $element)

  在一个元素上移除一个手势事件监听器。

$ionicGesture.off(eventType, callback, $element)

  参数介绍:

    参数              类型                详情
eventType string 监听的手势事件。
callback function(e) 当手势事件发生时触发的事件。
$element element angular元素监听的事件

  网站i这对$ionicGesture的介绍把我坑的不要不要的,.on()方法没错,.off()参数不对啊!

  这里的off()方法我按网站i的介绍做完,弄了好久都不行,后来按住alt点击$ionicGesture.off进去看源码是这样的才知道网站i介绍该方法错了。

  现整理汇总如下:

$ionicGesture服务--注册/解除手势事件监听

  注册手势事件监听函数

$ionicGesture.on(eventType, callback, $element)
on()方法返回的是一个ionic.gesture对象,可供解除监听用。

参数介绍:

  • 参数eventType是支持的事件类型;
  • 参数callback指定监听函数;
  • 参数$element是要绑定事件的jqLite元素;
  • 参数options是on方法返回对象的一个子对象options。

  解除手势事件监听函数

$ionicGesture.off(gesture,eventType,callback)

  参数介绍:

  • 参数gesture是on()方法返回的结果对象;
  • 参数eventType是支持的事件类型;
  • 参数callback是要移除的监听函数。

注意:canllback默认参数event,后面代码有提到。

  $ionicGesture服务支持的事件类型有:

hold, tap, doubletap, drag, dragstart, dragend, dragup, dragdown, dragleft, dragright, swipe, swipeup, swipedown, swipeleft, swiperight, transform, transformstart, transformend, rotate, pinch, pinchin, pinchout, touch, release

举个例子:

结构层:

<div>
<p>注册、解除手势事件都是按顺序,先button1在button2</p>
<p>点击bind一次button注册一次事件</p>
<button ng-click="add()">bind</button>
<p>点击unbind一次button解除一次事件</p>
<button ng-click="delete()">unbind</button><br><br>
<button id="idCardNick">idCardNick button1</button><br><br>
<button id="licenseNick">licenseNick button2</button>
</div>

  只为实现简单的效果,样式比较呵呵!

  效果:bind、unbind按钮注册、解除手势事件,都是按顺序,先button1在button2。

行为层:

  写在末尾的公用方法

        $scope.add=function(){
if($scope.data.length<2){$scope.data.push('nick');}
};
$scope.delete=function(){
$scope.data.pop();
};

  .on()和.off()的监听函数

    function clickFn(ev,idx){
//这里默认的arguments是event 自定义的参数idx无法获取??
console.log(arguments);
console.log(idx);//undefined
console.log($scope.idx);//这样可以获取idx对象
};
这里要注意的就是监听函数的默认参数event,我开始天真的写成下面这样
function clickFn(idx){
  ……
}

这样写坑死我啦,后来打桩console.log(idx);结果打印出来是event,我勒个去!

监听data.length动态添加删除click事件
  $scope.data=[];
  var clickGesture0,clickGesture1,unbindWatch;
  unbindWatch=$scope.$watch('data.length',function(newval,oldval){
if(newval==0){
if(clickGesture0){OffclickFn(clickGesture0);}
if(clickGesture1){OffclickFn(clickGesture1);}
}else if(newval==1){
clickGesture0=AddclickFn('#idCardNick',0);
if(clickGesture1){OffclickFn(clickGesture1);}
}else if(newval==2){
clickGesture1=AddclickFn('#licenseNick',1);
}else{//不用时为了性能销毁watch
unbindWatch();
}
console.log(clickGesture0);
});

添加监听手势函数AddclickFn这里有2中写法  

  写法一:

    function AddclickFn(selector,idx){
return $ionicGesture.on('click',function(){
console.log(arguments);
console.log(idx);//这样可以获取idx
},angular.element(document.querySelector(selector)));
};

这样写$ionicGesture.on()的监听函数callback就可以获取参数idx,但是这样写$ionicGesture.off()就不能解除callback监听函数了,所以我写成了第二种写法。

  写法二:

function AddclickFn(selector,idx){
return $ionicGesture.on('click',clickFn,angular.element(document.querySelector(selector)),$scope.idx={idx:idx});
};

  将idx存入options.idx在作为对象存入$scope.idx,这样clickFn就可以使用$scope.idx.idx,即参数idx的值。

  这里虽然写法二能实现效果,但我总感觉这样写不好,希望有大牛能给点建议,给我留言或者qq联系,多谢!

  移除手势监听函数:

 function OffclickFn(clickGesture){
$ionicGesture.off(clickGesture,'click',clickFn);
};

我把需要注意的地方都加注释了,上完整代码:

<!DOCTYPE html>
<html ng-app="nickApp">
<head>
<meta charset="utf-8" name="viewport" content="initial-scale=1,maximum-scale=1,user-scalable=no,width=device-width,height=device-height">
<script src="lib/ionic/js/ionic.bundle.min.js"></script>
<link rel="stylesheet" type="text/css" href="lib/ionic/css/ionic.min.css">
</head>
<body ng-controller="nickCtrl">
<div>
<p>注册、解除手势事件都是按顺序,先button1在button2</p>
<p>点击bind一次button注册一次事件</p>
<button ng-click="add()">bind</button>
<p>点击unbind一次button解除一次事件</p>
<button ng-click="delete()">unbind</button><br><br>
<button id="idCardNick">idCardNick button1</button><br><br>
<button id="licenseNick">licenseNick button2</button>
</div>
<script>
/* http://www.ionic.wang/js_doc-index-id-58.html
on(eventType, callback, $element)
off(eventType, callback, $element)
参数 类型 详情
eventType string 监听的手势事件。
callback function(e) 当手势事件发生时触发的事件。
$element element angular元素监听的事件。*/ /*
//完整汇总:
$ionicGesture服务--注册/解除手势事件监听:
on(eventType,callback,$element,options) - 注册手势事件监听函数
参数eventType是支持的事件类型;
参数callback指定监听函数;
参数$element是要绑定事件的jqLite元素。
参数options是on方法返回对象的一个子对象options
on()方法返回的是一个ionic.gesture对象,可供解除监听用。
off(gesture,eventType,callback) - 解除手势事件监听函数
参数gesture是on()方法返回的结果对象,
参数eventType是支持的事件类型
参数callback是要移除的监听函数。
$ionicGesture服务支持的事件类型有:
hold, tap, doubletap, drag, dragstart, dragend, dragup, dragdown, dragleft, dragright, swipe, swipeup, swipedown, swipeleft, swiperight, transform, transformstart, transformend, rotate, pinch, pinchin, pinchout, touch, release*/
angular.module('nickApp',['ionic'])
.controller('nickCtrl', ['$scope','$ionicGesture',
function ($scope,$ionicGesture){
$scope.data=[];
var clickGesture0,clickGesture1,unbindWatch; //监听data.length动态添加删除click事件
unbindWatch=$scope.$watch('data.length',function(newval,oldval){
if(newval==0){
if(clickGesture0){OffclickFn(clickGesture0);}
if(clickGesture1){OffclickFn(clickGesture1);}
}else if(newval==1){
clickGesture0=AddclickFn('#idCardNick',0);
if(clickGesture1){OffclickFn(clickGesture1);}
}else if(newval==2){
clickGesture1=AddclickFn('#licenseNick',1);
}else{//不用时为了性能销毁watch
unbindWatch();
}
console.log(clickGesture0);
}); /*function AddclickFn(selector,idx){
return $ionicGesture.on('click',function(){
console.log(arguments);
console.log(idx);//这样可以获取idx
},angular.element(document.querySelector(selector)));
};*/
function AddclickFn(selector,idx){//将idx存入options.idx在作为对象存入$scope.idx
return $ionicGesture.on('click',clickFn,angular.element(document.querySelector(selector)),$scope.idx={idx:idx});
}; /*
按住alt点击$ionicGesture.off进去看源码是这样的
才知道ionic.wang这网站介绍gusture方法错了
off: function(gesture, eventType, cb) {
return window.ionic.offGesture(gesture, eventType, cb);
}*/ $scope.add=function(){
if($scope.data.length<2){$scope.data.push('nick');}
};
$scope.delete=function(){
$scope.data.pop();
}; function clickFn(ev,idx){
//这里默认的arguments是event 自定义的参数idx无法获取??
console.log(arguments);
console.log(idx);//undefined
console.log($scope.idx);//这样可以获取idx对象
};
function OffclickFn(clickGesture){
$ionicGesture.off(clickGesture,'click',clickFn);
}; }]); </script>
</body>
</html>

再唠叨下:上面写法二我总感觉不好,希望有大牛能给点建议,给我留言或者qq联系,多谢!

ionic之$ionicGesture手势(大坑)的更多相关文章

  1. ionic之AngularJS——手势事件

    长按 : on-hold 在屏幕同一位置按住超过500ms,将触发on-hold事件: 你可以在任何元素上使用这个指令挂接监听函数: <any on-hold=“…”>…</any& ...

  2. angularjs+ionic的app端分页和条件

    做app项目积分商城的商品列表需要分页显示 实现: ionic滚动条:ion-scroll 用于创建一个可滚动的容器. 附:菜鸟教程:http://www.runoob.com/ionic/ionic ...

  3. 总结angular+ionic项目中的问题

    1:tab的路由导向问题 运用ion-tabs时,第一个ion-tabs标签下的href功能会覆盖掉路由中定义的默认路由(进入应用后直接加载href指向的组件). 解决方法:多写一个ion-tabs标 ...

  4. Ionic Js七:手势事件

    1.on-hold 长按的时间是500毫秒. HTML 代码 <button on-hold="onHold()" class="button">长 ...

  5. Ionic4.x Javascript 扩展 ActionSheet Alert Toast Loading 以及 ionic 手势相 关事件

    1.ActionSheet 官方文档:https://ionicframework.com/docs/api/action-sheet <ion-header> <ion-toolb ...

  6. ionic 禁用 手势 滑动返回

    $ionicConfigProvider.views.swipeBackEnabled(false); 在 应用的 config里面 配置下 上面的那句话 就OK了.

  7. 160914、ionic指令简单布局

    1) 添加引用类库(ionic样式和ionic js文件) 2) 标题栏,页脚栏,内容区 3) Js引入ionic类库,添加页面操作方法和对象 4) 数据初始化 5) Html页面绑定方法和对象 &l ...

  8. ionic基础知识

    ion-header-bar(头部 页眉) 在内容顶部添加一个固定header栏. 用法 <ion-header-bar align-title="left" class=& ...

  9. Ionic学习笔记3_ionic指令简单布局

    1)   添加引用类库(ionic样式和ionic js文件) 2)   标题栏,页脚栏,内容区 3)   Js引入ionic类库,添加页面操作方法和对象 4)   数据初始化 5)   Html页面 ...

随机推荐

  1. async & await 的前世今生(Updated)

    async 和 await 出现在C# 5.0之后,给并行编程带来了不少的方便,特别是当在MVC中的Action也变成async之后,有点开始什么都是async的味道了.但是这也给我们编程埋下了一些隐 ...

  2. java中servlet的各种路径

    1. web.xml中<url-pattern>路径,(叫它Servlet路径!) > 要么以“*”开关,要么为“/”开头 2. 转发和包含路径 > *****以“/”开头:相 ...

  3. WCF学习之旅—第三个示例之四(三十)

           上接WCF学习之旅—第三个示例之一(二十七)               WCF学习之旅—第三个示例之二(二十八)              WCF学习之旅—第三个示例之三(二十九)   ...

  4. Vue-Router 页面正在加载特效

    Vue-Router 页面正在加载特效 如果你在使用 Vue.js 和 Vue-Router 开发单页面应用.因为每个页面都是一个 Vue 组件,你需要从服务器端请求数据,然后再让 Vue 引擎来渲染 ...

  5. Laravel 5.x 请求的生命周期(附源码)

    Laravel最早接触是刚开始实习的时候,那时通过网上的学习资料很快便上手,开发模块接口.后来没有什么深入和总结,但是当我刚开始学Laravel的时候,我对Laravel最大的认识就是,框架除了路由. ...

  6. Smarty的基本使用与总结

    含义: Smarty是PHP的一个引擎模板,可以更好的进行逻辑与显示的分离,即我们常说的MVC,这个引擎的作用就是将C分离出来. 环境需求:PHP5.2或者更高版本 我使用的环境是:PHP5.3,wi ...

  7. %iowait和CPU使用率的正确认知

    resources 理解 %IOWAIT (%WIO) LINUX系统的CPU使用率和LOAD Linux Performance Observability Tools How Linux CPU ...

  8. NPM如何更新到最新版

    参考文章--npm更新到最新版本的方法 其实我们可以这样,随便新建一个文件夹例如:F:\test.按着"shift"键,右键该文件夹,选择"在此处打开命令窗口(W)&qu ...

  9. C#事件-使用事件需要的步骤

    事件是C#中另一高级概念,使用方法和委托相关.奥运会参加百米的田径运动员听到枪声,比赛立即进行.其中枪声是事件,而运动员比赛就是这个事件发生后的动作.不参加该项比赛的人对枪声没有反应. 从程序员的角度 ...

  10. gulp 自动添加版本号

    本文介绍利用 gulp-rev 和 gulp-rev-collector 进行版本管理 npm官网介绍使用后的效果如下: "/css/style.css" => " ...