ionic1開發(fā)之tabs

在實(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'
     }
  }
})
  1. 常規(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。

  2. 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'
  })
  1. 從tab頁(yè)面跳轉(zhuǎn)到其他頁(yè)面去的時(shí)候不用再寫隱藏tab-bar的代碼,也不用在tab頁(yè)面出現(xiàn)的時(shí)候?qū)戯@示tab-bar的代碼;

  2. 各個(gè)頁(yè)面之間的跳轉(zhuǎn)不會(huì)再出現(xiàn)tab上顯示的頁(yè)面是被跳轉(zhuǎn)的頁(yè)面。

  3. 各個(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")。

  4. 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è)面都不緩存。

  5. 在對(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);
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • afinalAfinal是一個(gè)android的ioc,orm框架 https://github.com/yangf...
    passiontim閱讀 15,857評(píng)論 2 45
  • WebSocket-Swift Starscream的使用 WebSocket 是 HTML5 一種新的協(xié)議。它實(shí)...
    香橙柚子閱讀 24,730評(píng)論 8 183
  • 今天是您的生日,母親,祝您生日快樂,祝您身體健康。
    閱微日記閱讀 695評(píng)論 0 0
  • 今兒聽兩個(gè)人講了兩個(gè)故事,細(xì)一琢磨,也是巧了,都是兩萬(wàn)元的事兒。 我一直覺得少爺不是很有少爺風(fēng)范,總是一...
    abigsmile閱讀 229評(píng)論 0 0
  • 赫拉 生藏于赫斯佩里德斯 頭戴鑲花冠冕 胸前系閃亮別針 耳掛珍珠寶石墜 借阿佛羅狄忒金腰帶 身披雅典娜精繡華美錦袍...
    洛桑爾靜閱讀 448評(píng)論 0 2

友情鏈接更多精彩內(nèi)容