在實(shí)際項(xiàng)目的開發(fā)中,項(xiàng)目的長(zhǎng)相也就是UI的結(jié)構(gòu),常見的大致分為三種:tabs型,slide-menu型以及其他型。
tabs型尤為常見,也就是在app的底部被分為了幾個(gè)選項(xiàng)卡(tab)。大部分app都是tabs型,使用ionic start創(chuàng)建項(xiàng)目的時(shí)候默認(rèn)的也是tabs的。
slide-menu:也就是側(cè)滑菜單,移動(dòng)版QQ就是一個(gè)tabs+slide-menu的app,單用slide-menu的也有,但比較少見。
常規(guī)做法
目前正在做的這個(gè)項(xiàng)目就是一個(gè)tabs的app,一開始的時(shí)候也是用的最常規(guī)的做法。創(chuàng)建了4個(gè)選項(xiàng)卡,tab1、tab2、tab3、tab4。
其他頁(yè)面根據(jù)分類放到各個(gè)tab下,也就是在配置路由的時(shí)候給每個(gè)非tab的頁(yè)面都設(shè)置views、
.state('tab.xxx', {
url:'/xxx',
views:{
'tab1':{
templateUrl:'templates/xxx.html',
controller:'xxxCtrl'
}
}
})
常規(guī)的做法基本上能滿足大部分的需求,只是在tab頁(yè)面跳轉(zhuǎn)到tab的views的頁(yè)面去的時(shí)候,需要用代碼$ionicTabsDelegate.hide()來(lái)隱藏tab-bar,然后在tab頁(yè)面出現(xiàn)的時(shí)候又調(diào)用$ionicTabsDelegate.show()來(lái)顯示tab-bar。
tab1的views下的A頁(yè)面跳轉(zhuǎn)到tab2的views下面的B頁(yè)面,單用$state.go()來(lái)進(jìn)行跳轉(zhuǎn),跳轉(zhuǎn)的時(shí)候不會(huì)出現(xiàn)前進(jìn)的動(dòng)畫;
如果使用$ionicViewSwitcher.nextDirection("forwoard/back")來(lái)添加動(dòng)畫,在跳轉(zhuǎn)的過程中會(huì)出現(xiàn)黑屏的現(xiàn)象;
當(dāng)從B頁(yè)面返回到A頁(yè)面,再返回到tab1頁(yè)面然后切換到tab2時(shí),直接在tab2上顯示的是B頁(yè)面。此時(shí)點(diǎn)擊頁(yè)面B的返回按鈕做$ionicHistory.goBack()回到的是tab1頁(yè)面。此時(shí)可在每個(gè)tab頁(yè)面出現(xiàn)時(shí)寫入$ionicHistory.clearHistory()來(lái)實(shí)現(xiàn)切換到tab2去看到的是tab2的頁(yè)面。
其他頁(yè)面不設(shè)置views
做到這個(gè)時(shí)候,我選擇了另外一種做法,在配置路由時(shí)不再給每個(gè)非tab頁(yè)面設(shè)置views
.state('xxx', {
url:'/xxx',
templateUrl:'templates/xxx.html',
controller:'xxxCtrl'
})
從tab頁(yè)面跳轉(zhuǎn)到其他頁(yè)面去的時(shí)候不用再寫隱藏tab-bar的代碼,也不用在tab頁(yè)面出現(xiàn)的時(shí)候?qū)戯@示tab-bar的代碼;
各個(gè)頁(yè)面之間的跳轉(zhuǎn)不會(huì)再出現(xiàn)tab上顯示的頁(yè)面是被跳轉(zhuǎn)的頁(yè)面。
各個(gè)頁(yè)面之間跳轉(zhuǎn)全沒有動(dòng)畫了,所以就需要在跳轉(zhuǎn)的時(shí)候加上代碼來(lái)實(shí)現(xiàn)跳轉(zhuǎn)動(dòng)畫。
$state.go()后面加上$ionicViewSwitcher.nextDirection("forwoard");
$ionicHistory.goBack()后面加上$ionicViewSwitcher.nextDirection("back")。A頁(yè)面forward到頁(yè)面B,然后B頁(yè)面back到A頁(yè)面,此時(shí)B頁(yè)面的緩存是不會(huì)被自動(dòng)清除。
此時(shí)最簡(jiǎn)單的做法就是不緩存頁(yè)面,可以在ion-view標(biāo)簽中設(shè)置cache-view=false;
也可以在配置路由的時(shí)候設(shè)置cache:false;
當(dāng)然也可以設(shè)置全局最大緩存$ionicConfigProvider.views.maxCache(0),0表示所有頁(yè)面都不緩存。-
在對(duì)app的用戶體驗(yàn)要求不是很高的時(shí)候可以通過設(shè)置緩存來(lái)做,如果對(duì)用戶體驗(yàn)要求高一些的話,那就要通過代碼對(duì)$ionicHistory的操作來(lái)實(shí)現(xiàn)緩存的清理。目前我的做法是這樣的,不排除還有更好的辦法可以解決這個(gè)問題!
var backView = $ionicHistory.backView(); if (!backView) return;var clearStateIds = []; var forwardViewId = backView.forwardViewId; if (!forwardViewId) { clearStateIds.push($ionicHistory.currentView().stateId); } else { while (forwardViewId) { var view = $ionicHistory.getViewById(forwardViewId); clearStateIds.push(view.stateId); forwardViewId = view.forwardViewId; } } $timeout(function () { $ionicHistory.clearCache(clearStateIds); }, 600);