最近在用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中的其他方法不會執行。因此點擊事件不會被注冊。
