ionic-轻触touch背景幕关闭popup弹出框
今天微信所谓的应用号“小程序”刷屏了,网上很多的技术人员都在讨论,微信整合了很多的web组件式功能提供给开发者,降低开发门槛,力求做到极致的原生体验和提高性能,很多人就担心,说看来微信要灭掉APP,一个微信统领江湖啊。最着亮人眼的是“不需要下载安装”。这表明可以从一定程度上,用户不需要在手机上安装那么多的APP,占用内存。腾讯的野心很明显,利用微信强大的用户体系和精准的推广,形成一
最着亮人眼的是“不需要下载安装”。这表明可以从一定程度上,用户不需要在手机上安装那么多的APP,占用内存。
腾讯的野心很明显,利用微信强大的用户体系和精准的推广,形成一个基于微信为入口的移动应用分发,对于企业来说,微信的社交基因以及高频使用率,必定会让众多的企业对这一个“小程序”所青眯的。对于APP开发者来说,是好事,你们获取用户的门槛将无比的降低,潜在用户数无比的大。记得锤子手机罗永浩曾经做过一个调查,用户手机上安装的app不会超过60个(可能是70个),而市场上有成千上万个APP。更为关键的因素是,手机的内存是有限的,可以安装的app也是有上限的。
其实相对于微信原先的微信公众号,是基于H5入口的说到底也就是一个内嵌的浏览器一样访问mobil web页面,体验上,操作上还是给人一种web app的体验。
对于腾讯在产品这一块的优势,相信这一次的“小程序”将会给腾讯和企业都带来双赢的,但同时也会对一些Appstore、豌豆荚、360应用中心、应用宝等分发市场做成一定影响的。
微信“小程序”肯定灭不了app,毕竟有些独立的场景化应用还是需要独立的app完成的,只是微信又找到一种新的分发模式。
OK,我们回到正题,说说ionic的一些细节。
最近在ionic的开发上遇到了一个问题,关于Ionic弹窗服务popup和浮层服务popover。
我们开发的知道POPUP可以弹出对话框,与用户进行交互的方式,这种模式在app的使用上非常见,而且用户体验也是非常好的。
但是在弹出popup对话框时,会有一层背景幕,如下图:
我们可以点击弹窗的“cancel”或者“ok”等按钮确定,然后会关闭整个弹出框,但有时我们希望的是另一种体验,我们直接触摸一下就可以将弹出框关闭了,比如说,弹出框是分享的列表,包括qq,微信,微博等,这个场景下,弹出框肯定不会再设置“cancel”或者“ok”这些按钮的了。
用户想分享一篇文章,点击分享图标后,弹出分享列表,突然间用户又不想分享了,他现在要关闭这一个弹出的分享框,那么用户有两种做法,第一,点击手机的返回键,可以关闭弹出框,第二,用户希望轻轻触摸一下背景幕也就能够关闭弹出框。
现在就需要想办法解决这一个体验上的问题,而最好的是基于angular指令的模式来做,定义一个指令,可以在需要的页面上,运用该指令,进行监听是否触摸该背景幕。
在一个controller中:
.controller('articel',function($scope,$ionicPopup) {
// $scope.myPopup 记录弹出框是否弹出的状态,isPopup默认是false
$scope.myPopup = {
'isPopup':false
};
//点击分享按钮,弹出弹框,显示列表,
$scope.showShare = function() {
$scope.optionsPopup = $ionicPopup.show({
//这里简单列一下
template: '<div class="row">\
<div class="col"><i class="ion-chatbubbles"></i><br/>微信</div>\
<div class="col"><i class="ion-chatbubbles"></i><br/>微信</div>\
<div class="col"><i class="ion-chatbubbles"></i><br/>微信</div>\
<div class="col"><i class="ion-chatbubbles"></i><br/>微信</div>\
<div class="col"><i class="ion-chatbubbles"></i><br/>微信</div>\
</div>',
title: '分享文章',
scope: $scope,
});
//弹出框弹出后,isPopup标志为true状态。
$scope.myPopup = {
'isPopup':true
};
})在这里需要注意的是$scope.optionsPopup是返回来的一个对象,里面有一个close()函数可以关闭弹出框。
如下图:
那么我们需要定义一个指令closePopupBackDrop:
.directive('closePopupBackDrop', ['$ionicGesture',function($ionicGesture) {
return {
scope: false,//共享父scope
restrict: 'A',
replace: false,
link: function(scope, element, attrs, controller) {
//要在html上添加点击事件, 试了很久- -!
var $htmlEl= angular.element(document.querySelector('html'));
$ionicGesture.on("touch", function(event) {
if (event.target.nodeName === "HTML" && scope.myPopup.isPopup) {
scope.optionsPopup.close();
scope.myPopup.isPopup = false;
}
},$htmlEl);
}
};
}])scope继承原来controller中的$scope,所以scope.optionsPopup也就是相当于controller的$scope.optionsPopup,调用close()可以关闭弹出框,那么$ionicGesture.on("touch",function(),element,[options])可以对特定的元素进行监听,这里整个背景幕相当于html,所以当监听到当前的弹出框状态为true,事件目标为“HTML”,即可关闭弹出框,同时将状态设置为false。
那么指令可以在放在html的分享按钮上或者适合页面的元素上,一定是要写成close-pup-back-drop这样子写的哦哦。
比如:
<div class="buttons" close-pup-back-drop>
<button class="button button-icon icon ion-android-share-alt"></button>
</div>
更多推荐


所有评论(0)