apicloud踩坑集锦

   最近在用apicloud开发,这里录入一些踩坑的地方,从头到尾,要多尴尬有多尴尬,新入app开发,记录一些心得,和遇到的坑以及解决办法。

 1,apicloud 打包的Android app ,打开frame页面时,配置rect时(窗口的大小位置描述),发现,‘auto’的宽度,约有15px的右边留白。目前不知道具体原因。

        详细描述一下问题,即openFrame的时候,设置rect: { w:'auto' }(其他配置省略描述)时,在新frame中,设置div宽度为100%,不能够充满通栏。右侧有约

        15px的留白,目前比拙劣的使用了,api.frameWidth+15进行了通栏操作,但是,div右侧会有15px进入到右边向左滑动才会出现的间隙留白。因此给了右边

       一个15px的内边距padding解决了。(非常想说是15公分),不知道是否是常见问题,apicloud社区没有搜到相关问题有知道的大佬,烦请告知。

 还有很多问题,再慢慢总结,先上班,未完待续~~~~~欢迎沟通交流,谢前辈们。

 

1. tac深坑 ,tac根据当前 宽度,进行文本的自适应水平居中,但是在移动端,屏幕大小变化的,无法同步自适应。
导致文字剧中,解决方法,div包裹,文本,转化为div在div中水平,垂直剧中即可
在浏览器环境下,window.onresize事件中,可以动态添加div行内属性,textAlign='center'.


2. 利用jq的序列化方法serializeArray ,封装了一个serializeObject方法,并重新挂在jQuery.prototype上。
3. 入口文件index.html 首先应该判断是否登陆,如果登陆,在初始化页面,打开首页main.html对应的页面,如果没有登陆
就应该显示login.html对应的页面,配合localStorage进行验证 这里如果要用到token会好一些,可以在登录时,给后台发送token,判断token是否过期。

更好的控制登录。


4. apicloud中5大ui 组件之间的关系是, app>(启动页)>widget(一个或者多个项目包)>window
(每一个项目包对应默认打开一个window)>frame/frameGroup的关系,最开始打开应用的时候默认打开的文件就
是一个window 。基本是window+frame的布局方式在子frame会依赖在父frame上。


5 在apicloud中,尽量使用padding去设置,大的木块如header,main边距,否则,会增高#wrap的高度,高出一个
api.frameHeight的高度就会出现留白。


6 在apiready中才能够访问到api,引入外部ui组件的时候,需要创建实例,实例的回调需要用到api方法,如openframe时
应该把实例定义在apiready中,其实即 ‘’ ‘’实际上也就挂载在api上,$api也能够访问。也可以把window.apiread挂载window上

把ui对象实例化对象也挂载window上。

7 tapmode属性,解决300毫秒延迟


8 页面之间反向传值,可以在下一个页面frame定义一个api.sendEvent({})name 定义事件名称, extra 传递参数,
在监听事件addEventListener时,回调函数function(ret,err) 分部获取参数,和报错。传递参数有一个小坑,

出现2中取值情况。ret.value.key 或者ret.value.key.index 暂时不明白机制,做了兼容性处理。


9 布局中,将main部分当做是新的frame打开区域,打开main是在原来frame的情形下打开的,仍然会占据位置
如果需要底部的tabbar,并不能用定位定到底部。
10 实现底部按钮的时候,不能够直接定位到底部,app里面是不支持的,一般需要两端去头去尾,开辟一个frame空间,设置
高度之后,能够让底部botton站在底部位置。但是如果中间不需要新的frame的时候就不能够很好的让botton,居于底部
这里直接,在打开window的时候就在底部打开一个frame只用来装botton.html这样的话就能够实现了。
11 键盘弹出时, 盖住输入框。 ios可以监听事件keybordshow,回到中ret.h表示是键盘的高度,通过判断,输入框的高度,
来进行判断是否需要操作页面。
12 常识: apicloud中想要去操作dom,外面去获取,apiready中不一定能拿到dom出现问题 ,时机可能是不对的

13 使用api.bringFrameFont 方法是需要frame先打开的。为了节省资源,我判断了是否打开。如果没打开,则openFrame,

如果已经打开了,选择api.bringFrameFont ,判断依据比较拙劣,使用的是var frames = api.frames()返回一个包含已打开frame名的

的动态数组。数组包含对像{ name: }的形式。使用了filter筛选出的名称相等的数组,进行了长度判断。比较劣质,欢迎讨论

14 关于api.bringFrameFont另外一个坑。不能够操作FrameGroup中的frame,通过frameGroup中的frame出现的形式,应该是左右排列的

所有不太生效。

15 小技巧,如果在操作按钮时,如果不想去操作dom注册事件,可以定义事件,然后再行内式注册事件,免去操作dom的麻烦。

16 header部分,因为需要title居中显示,通过会用到自觉父相的定位,导致back后退图片,在底下无法点到。记得给后退图标的元素,加相对定位!

  这就是为什么,无法调用api.closeWin关闭窗口的原因。

17 在使用api.execScript方法时,需要注意的是,当参数数据为复杂数据类型时,如果不转化为jSON类型的话,会报语法错误。其用法类似于JSONP,通过调用

  函数,实参传递给形参得方式,在另外一个页面拿到当前页面的数据。注意,外层引号为单引,避免与JSON数据类型双引号冲突。

18  apicloud打包IOS和Android 是有兼容性问题的,对于键盘 弹起判断的api只能够在config.xml文件中配置,并且无法作用于安卓,安卓可以自适应。且重点来了

      z-index 属性,在 苹果中如果使用负值,IOS是不支持的。Android的absolute 在IOS中如果父元素使用了flex布局,也是无效的。

18 移除外部引入css样式中默认设置的伪元素样式,可以通过伪元素diaplay :none;进行覆盖移除
19 frameGroup 中的坑非常多, 首先frameGroup整体应该是相当于 一个win ,依附在上面的frames能够正常的切换,且
不互相遮盖,需要win的的模块,比如就是这个坑爹的arcmenu 就是,依然能够正常显示,但是在每一个frame中再次打开frame
时,就会出现层叠情况。所以,应该避免。
20 setFrameGroupIndex 需要事件是一个异步过程 ,页面呈现之后,类似于打开的frameGroup的页面才能接受到监听的机制
会有一个时间上的,变差。在完成之前,如果关闭当前页面跳转到,制定index的页面,由于页面关闭比回调快,会出现
设置index无效的情况。因此,可以以后在回调中,监听,如果完成index的切换,再进行关闭跳转操作。
21 关闭某个win 和当前win之间的所有win ,跳转到某个win的时候,用api.closeToWin()
22 用doT模板的是后,如果在循环数组中,判断条件是表达式,那么已经把表达式括号包起来,否则天坑!!!
实际测试并不用包裹,起来,但是不能够使用&& 语法,进行多条件的判断,而且分嵌套判断也是必须经的,已经会造成
语法编译的混乱。 目前处理方法是手动,提前改变数据
23 简单数据类型,字符串类型,是可以直接通过$api.getStorage('等等') 是可以获取到的,单是复杂的数据类型,还是的JSON.parse,
目前集成的说法,正确的理解,应该是,已经封装的storgae可以直接存储对象等,那么久在存储的时候避免是用stringify进行转化
-------------先验证 - ---------------- 验证结果:验证成功,直接进行存储记得,如果存储的时候使用了stringify进行,存储
在获取的时候就必须进行JSON.parse() 的转化。
24 如果表示 变量数据类型为{ } 一个空的对象,那么出现一个问题。如果判断if(data == {}) 的时候,改条件是不成立的,
最好判断其属性。
25 关于网络问题,利用你conectionType进行判断,细分为2g,3g,4g,无网络,以太网等等,由此判断,连接网络的类型,而且
网络监听,只在网络连接环境发生变化的时候才能够触发。
26 获取偏好设置成同步获取就好了,apicloud中,异步获取,添加自己的操作难度。

27 因为frameGroup特殊的缓存机制,在apicloud中,如果使用的是,注册点击事件进行的点击跳转。如果在framegroup中其他
页面,跳转到新的win时,frameGroup中的其他方法不会执行。因此点击事件不会被注册。

posted @ 2019-05-27 08:11  爱编程的那尼拓  阅读(1451)  评论(2编辑  收藏  举报