ionic部分
生命週期
ionic有自身的生命週期,不可與angular混用;
路由
ionic有自身的路由機制,不可用angular路由;
ionic顏色定製
- 坑:ionic的部分元件是有color屬性,更改其元件顏色只需更改其color值,開發時需要新的顏色,直接改style太粗暴。
- 解決:theme目錄下variables.scss可在$colors處定製顏色。
頁面元件ion-content
- 坑:頁面預設有下拉阻尼效果,我們不想要頁面可以被下拉
- 解決:給ion-content標籤加no-bounce屬性
下拉重新整理元件ion-refresher
- 坑:下拉時準備動畫消失
- 解決:給ion-refresher元件加上ionPull事件。
- 坑:當使用橫向滾動元件時,觸發refresher元件。
- 解決:給橫向滾動元件加摁下和離開事件,改變一個布林值的值,把這個值與ion-refresher enabled屬性繫結。
-
<ion-refresher [enabled] ='refresherB && showLoading$ | async' pullMin='60' pullMax='300' (ionPull)='doRefress()' (ionRefresh)="doRefresh($event)"></ion-refresher> 複製程式碼
navCtrl.push
- 坑:navCtrl.push到一個新頁面後需要底部tabs消失
- 解決:
-
//在頁面構造前的鉤子上加上 let elements = document.querySelectorAll(".tabbar"); if (elements != null) { Object.keys(elements).map((key) => { elements[key].style.display = 'none'; }); } //在頁面銷燬的鉤子上加上 let elements = document.querySelectorAll(".tabbar"); if (elements != null) { Object.keys(elements).map((key) => { elements[key].style.display = 'flex'; }); } 複製程式碼
ion-tabs元件
- 坑:ion-tab無法通過常規方式定製圖示
- 解決:通過sass指令遍歷要替換的圖示名稱,實行替換
angular部分
無關聯元件間通訊
- 坑:無關聯元件如何更優雅的通訊
- 解決:註冊一個全域性的服務,建立一個可觀察的物件,然後在需要的元件訂閱它。
-
public eventBus:Subject<string> = new Subject<string>(); 複製程式碼
Animations 動畫模組
- 坑:Safari預設不支援angular的所用Animations
- 解決:npm i web-animations-js 之後在polyfills檔案引入
- 坑:從服務端取到資料後給定義的變數賦值,所有相關dom都觸發動畫效果
- 解決:取到資料後,不要做賦值操作,在原變數上進行增刪操作。
ngRx與髒檢查
- 坑:當頁面邏輯複雜時,生命週期無法滿足對狀態的管理。
- 解決:使用ngRx來優雅的進行狀態管理,因為ngRx對狀態的管理基於流,angualr的生命週期基於髒檢查,兩種不同的邏輯,所以應在專案開始時就決定是否使用。
- 坑:使用ngRx後元件狀態混亂
- 解決:使用ngRx應關閉angualr髒檢查機制
-
@Component({ changeDetection:ChangeDetectionStrategy.OnPush }); 複製程式碼
- 坑:關閉angular髒檢查後,需要使用髒檢查檢查更新元件時
- 解決:引入angualr的ChangeDetectorRef元件在元件建構函式宣告後呼叫其detectChanges()方法觸發重新整理。
HttpClientModule
- 坑:jsonp
- 解決:angular4.3之後推出的HttpClient對jsonp非常不友好,除了發請求功能全無,無法設定查詢引數(可以用拼字串解決),和後臺協商使用get或post;
- 坑:查詢引數 HttpParams 的set方法
- 解決:每當呼叫 set() 方法,將會返回包含新值的 HttpParams 物件,因此如果使用下面的方式,將不能正確的設定引數。
-
//無法正確設定,這是angualr4.3之前http模組的寫法 const params = new HttpParams(); params.set('orderBy', '"$key"'); params.set('limitToFirst', "1"); //代替方案 const params = new HttpParams(); params = params.append('orderBy', "$key"); params = params.append('limitToFirst', "1"); 複製程式碼
- 坑:post請求查詢引數設定
- 解決:post請求依然可以使用HttpParams物件作為設定查詢引數方式,為了不出問題最好params.toString();