今天微信所谓的应用号“小程序”刷屏了,网上很多的技术人员都在讨论,微信整合了很多的web组件式功能提供给开发者,降低开发门槛,力求做到极致的原生体验和提高性能,很多人就担心,说看来微信要灭掉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”这些按钮的了。


有一个场景:

用户想分享一篇文章,点击分享图标后,弹出分享列表,突然间用户又不想分享了,他现在要关闭这一个弹出的分享框,那么用户有两种做法,第一,点击手机的返回键,可以关闭弹出框,第二,用户希望轻轻触摸一下背景幕也就能够关闭弹出框。


但是我们的ionic的popub默认可以实现第一种的方法,点击手机返回键,关闭弹出框,而第二种方法,是没有实现的,就算怎么点击背景幕都没有办法关闭弹出框的。

现在就需要想办法解决这一个体验上的问题,而最好的是基于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>


Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐