apicloud apicloud

注册
查看: 4706|回复: 19

[APP开发技巧] 双11福利,封装其它原生模块方法,顺便注释缓存win

主题:
124
帖子:
694
云币:
2454

[APP开发技巧] 双11福利,封装其它原生模块方法,顺便注释缓存win

4706 19 | 发表于 2015-11-11 15:16:28 |阅读模式 | |
本帖最后由 老油条 于 2015-12-2 09:40 编辑

//common.js
var myapi = '';
(function() {
        var myapireadyDoSomethings = [];
        apiready = function() {
                for (var i = 0; i < myapireadyDoSomethings.length; i++) {
                        myapireadyDoSomethings();
                }
        }

        function myapiready(cb) {
                myapireadyDoSomethings.push(cb);
        }
        myapi = {
                myapiready: myapiready
        }
})()
/**
* 事例
* 这是封装的apiready函数;很多场合,需要自封装原生模块,但是苦于其只支持一个apiready,而引入此段函数后就可以解决这个问题,同时不允许出现apiready,会覆盖的哟,所以一旦您想封装自己的函数,可以参考以下的方式:
这里以UISrcollView为例

var UIscrollView = '';
(function($) {
        var UIs = '';
        $.myapiready(function() {
                        UIs = api.require('UIScrollPicture');
                }

                function open(data) {
                        UIs.open({
                                rect: {
                                        x: 0,
                                        y: 20,
                                        w: api.winWidth,
                                        h: 200
                                },
                                data: data,//传入的data
                                styles: {
                                        caption: {
                                                height: 35,
                                                color: '#E0FFFF',
                                                size: 13,
                                                bgColor: '#696969',
                                                position: 'bottom'
                                        },
                                        indicator: {
                                                align: 'center',
                                                color: '#FFFFFF',
                                                activeColor: '#DA70D6'
                                        }
                                },
                                placeholderImg: 'widget://res/slide1.jpg',
                                contentMode: 'scaleToFill',
                                interval: 3,
                                loop: true,
                                fixedOn: '',
                                fixed: false
                        }, function(ret, err) {
                                if (ret.status) {
                                        if (ret.eventType == 'click') {
                                                //点击图片的操作
                                                alert(ret.index);
                                        }
                                }
                        });
                }

                function reloadData(data) {
                        UIs.reloadData({
                                data: data //传入的data
                        });
                }
                UIscrollView={
                        openpen,
                        reloadData:reloadData
                }
        }))(myapi)
//然后您就可以通过UIscrollView.open(data)直接打开了,并不会报错。而且不需要调样式,是不是很方便?
**/
//page.js(winA open winB)
var page = '';
(function($) {
        //
        //winA相关
        //
        var firstParam = '';//第一次需要的值,适用于页面的初始化数据

        function openWin(pg) {
                var x = {};
                if (firstParam == '') {
                        firstParam = x = pg.staticParam;
                }//效果是,第一次传过去的staticParam会被发送出去,第二三次不会发出去
                api.sendEvent({
                        name: pg.name + '_doSomething',
                        extra: {
                                pageParam: pg.pageParam
                        }
                })//发送事件
                api.openWin({
                        name: pg.name,
                        url: pg.url,
                        pageParam: {
                                value: {
                                        pageParam: pg.pageParam,
                                        staticParam: {
                                                prepName: api.winName,
                                                staticParam: x
                                        }
                                }
                        }
                })//打开win,pageParam设置的那么奇特是因为,send事件的数据奇特,要求接收到格式一样
        }
        //
        //winB相关
        //
        var keyBackDoSomething = [];//返回事件
        function keybackE(cb) {
                if (typeof(cb) == 'function') {
                        keyBackDoSomething.push(cb);//多次触发返回事件
                }
        }
        
        function goBack(){
                        $.myapiready(function() {
                        api.addEventListener({
                                name: 'keyback'
                        }, function(ret, err) {
                                for (var k = 0; k < e.length; k++) {
                                        keyBackDoSomething[k]();
                                }
                                hideWin();
                        })
                })
        }

        var staticParam = '';//传送过来的第一次数据,用于初始化
        var changeKeyback = '';//内置只接收一次,所以keyback会固定不变,但是会优先返回该值得页面

        function getStatic() {
                return staticParam.staticParam;
        }
//封装的核心
//封装的核心
//封装的核心
//重要的事说三遍:winB的关于数据的操作都依赖这个函数,无乱是第一次打开还是第二次打开,都会触发,原理看一会就会懂的
        function dataAction(cb) {
                $.myapiready(function() {
                        staticParam = api.pageParam.value.staticParam;
                        api.addEventListener({
                                name: api.winName + '_doSomething'
                        }, function(ret, err) {
                                if (typeof(ret.value.pageParam.keybackName) != 'undefined') {
                                        changeKeyback = ret.value.pageParam.keybackName;
                                }
                                return cb(ret.value.pageParam, err);
                        })
                        return cb(api.pageParam.value.pageParam, null);
                })
        }
//hideWin可以传pageParam:{},以便返回给上一个页面
        function hideWin(pg) {
                var pageParam = {
                        pageParam: {}
                }
        
                var keybackTo = '';
                if (changeKeyback == '') {
                        keybackTo = staticParam.prepName;
                } else {
                        keybackTo = changeKeyback;
                }
                        for (var x in pg) {
                        pageParam[x] = pg[x];
                        api.sendEvent({
                                name: keybackTo + '_doSomething',
                                extra: pageParam
                        });

                }
                api.openWin({
                        name: keybackTo,
                        animation: {
                                type: "push",
                                subType: "from_left",
                                duration: 300
                        }
                })
        }
//closeWin可以传pageParam:{},以便返回给上一个页面
        function closeWin(pg) {
                var pageParam = {
                        pageParam: {}
                }
                var keybackTo = '';
                if (changeKeyback == '') {
                        keybackTo = staticParam.prepName;
                } else {
                        keybackTo = changeKeyback;
                }
                for (var x in pg) {
                        pageParam[x] = pg[x];
                        api.sendEvent({
                                name: keybackTo + '_doSomething',
                                extra: pageParam
                        });
                }
                api.closeWin();
        }
        page = {
                openWin: openWin,
                keybackE: keybackE,
                goBack:goBack,
                dataAction: dataAction,
                hideWin: hideWin,
                getStatic: getStatic,
                closeWin: closeWin
        }
})(myapi)
/**
* 示例
page.openWin({
         name:'',
         url:'',
         pageParam:{test:'test'}         
})

page.keybackE(function(){
         //doSomething
})
page.dataAction(function(pageParam,err){
         //这里能获取数据pageParam
})
page.getStatic();//返回初始化所需要的数据
page.goBack();//返回事件生效
*/


//特别说明:
//page.openWin({
//        name:'',
//        url:'',
//        pageParam:{
//               
//        },
//        staticParam:{}非必须
//})固定返回的winName,第二次不会发送staticParam
//page.openWin({
//        name:'',
//        url:'',
//        pageParam:{
//                keybackName:api.winName
//        },
//        staticParam:{}非必须
//})固定返回当前(每次刷新覆盖的)的winName,第二次不会发送staticParam


如果有什么意见或者建议,请留言
2

查看全部评分

主题:
1102
帖子:
5126
云币:
2147214880

圣诞节捣蛋鬼APICloud大会专属勋章足球狗儿童节快乐

发表于 2015-11-11 15:20:02 |
感谢分享

主题:
21
帖子:
73
云币:
445
发表于 2015-11-11 15:25:30 |
谢谢分享  

新手上路

UID:36332

主题:
27
帖子:
92
云币:
206
发表于 2015-11-11 15:30:26 |
路过.......

新手上路

UID:150801

主题:
2
帖子:
17
云币:
38
发表于 2015-11-16 13:11:46 |
mark!!!!!!!!!!!!!!!!

实习司机

UID:164493

主题:
1
帖子:
177
云币:
833
发表于 2015-11-16 14:22:25 |
感谢分享 mark ...

驾校小白

UID:13120

主题:
3
帖子:
19
云币:
37
发表于 2015-11-19 19:39:13 |
感谢分享! 没明白怎么用,能举个例子说明下吗?

实习司机

UID:19143

主题:
39
帖子:
138
云币:
428
发表于 2015-11-30 10:35:59 |
楼主你代码BUG大大的我都不想说了~.而且还故意增加阅读难度是闹哪样~~~~~~~~而且fnReady.push(fn); 也只是插入一个数组..apiready 并没有执行起来..然并卵!!


如果要调用起来 起码要
apiready = function(){
        myReady.apiready();
};


是的楼主代码然并卵~

我给一个能用的

  1. var myReady = '';
  2. (function() {
  3.         var fnReady = [];
  4.         apiready = function() {
  5.                 for (var i = 0; i < fnReady.length; i++) {
  6.                         fnReady[i]();

  7.                 }
  8.                 alert(88888888);

  9.         }
  10.         myReady = {
  11.                 ready:        function (fn) {
  12.                                 fnReady.push(fn);
  13.                         },
  14.                         apiready: apiready
  15.         }
  16. })();

  17. var a = '';

  18. (function(fn){
  19.         fn.ready(function(){
  20.                 alert(66666);
  21.         });
  22.         a ={
  23.                 bbb : function(){
  24.                         alert(3333);
  25.                 }
  26.         }
  27. })(myReady);
  28. a.bbb();
复制代码


主题:
124
帖子:
694
云币:
2454
 楼主| 发表于 2015-11-30 16:02:41 |
微凉 发表于 2015-11-30 10:35
楼主你代码BUG大大的我都不想说了~.而且还故意增加阅读难度是闹哪样~~~~~~~~而且fnReady.push(fn); 也只是 ...

谁告诉你不能运行的,

业余车手

UID:22414

主题:
8
帖子:
815
云币:
12667

版主勋章APICloud粉丝

发表于 2015-12-1 12:23:41 |
感谢分享
12下一页
您需要登录后才可以回帖 登录 | 立即注册

快速回复 返回顶部 返回列表