2015-01-19 3 views
7

Ich habe Probleme mit $ionicHistory auf Seiten, wo ion-tabs verwendet werden. Ich navigiere damit zur vorherigen Ansicht (mit goBack()). Wenn ich Tabs in eine Ansicht einlege, ist der Verlauf falsch, Rückansicht ist zwei Ansichten vorher.

Um dies zu demonstrieren, habe ich eine Demo-App erstellt (plunker here), die 4 Seiten/Ansichten hat. Seite 1 -> Seite 2 -> Seite 3 -> Seite 4. Die letzte Seite hat Registerkarten.

angular 
.module("demoapp", ['ionic']) 
.config(['$stateProvider', '$urlRouterProvider', 
    function($stateProvider, $urlRouterProvider){ 
    $stateProvider 
     .state('first', { 
      url: '/', 
      controller: 'firstController', 
      templateUrl: 'first.html', 
     }) 
     .state('second', { 
      url: '/second', 
      controller: 'secondController', 
      templateUrl: 'second.html', 
     }) 
     .state('third', { 
      url: '/third', 
      controller: 'thirdController', 
      templateUrl: 'third.html', 
     }) 
     .state('fourth', { 
      url: '/fourth', 
      controller: 'fourthController', 
      templateUrl: 'fourth.html', 
     }); 

    $urlRouterProvider.otherwise("/"); 
    }]) 
.factory("historyFactory", ['$ionicHistory', function($ionicHistory){ 
    var show = function() { 
    var text = ""; 

    var vh = $ionicHistory.viewHistory(); 
    if(vh !== null) { 
     text += "VIEWS=" + JSON.stringify(vh.views); 
     text += "BACK=" + JSON.stringify(vh.backView); 
    } 

    return text; 
    } 

    return { 
    show : show, 
    } 
}]) 
.controller("firstController", [ 
    '$scope', 
    '$location', 
    function($scope, $location){ 
    $scope.next = function() { 
    $location.path("/second"); 
    }; 
}]) 
.controller("secondController", [ 
    '$scope', 
    '$location', 
    '$ionicHistory', 
    'historyFactory', 
    function($scope, $location, $ionicHistory, historyFactory){ 
    $scope.next = function() { 
     $location.path("/third"); 
    }; 

    $scope.prev = function() { 
     $ionicHistory.goBack(); 
    }; 

    var init = function() { 
     $scope.data = historyFactory.show(); 
    }; 

    init(); 
}]) 
.controller("thirdController", [ 
    '$scope', 
    '$location', 
    '$ionicHistory', 
    'historyFactory', 
    function($scope, $location, $ionicHistory, historyFactory){ 
    $scope.next = function() { 
     $location.path("/fourth"); 
    }; 

    $scope.prev = function() { 
     $ionicHistory.goBack(); 
    }; 

    var init = function() { 
     $scope.data = historyFactory.show(); 
    }; 

    init(); 
}]) 
.controller("fourthController", [ 
    '$scope', 
    '$ionicHistory', 
    'historyFactory', 
    function($scope, $ionicHistory, historyFactory){ 
    $scope.prev = function() { 
     $ionicHistory.goBack(); 
    }; 

    var init = function() { 
     $scope.data = historyFactory.show(); 
    }; 

    init(); 
}]); 

Dies ist, wie die Ansicht mit Registerkarten wie folgt aussieht:

<ion-view> 

    <ion-tabs class="tabs-balanced"> 
    <ion-tab title="Tab One"> 
     <ion-header-bar class="bar-balanced"> 
     <div class="buttons"> 
      <button class="button button-icon ion-ios-arrow-back" ng-click="prev()"></button> 
     </div> 
     <h1 class="title">Page 4 - Tab 1</h1> 
     </ion-header-bar> 

     <ion-content class="has-header"> 
      <h3>History</h3> 
      <p>{{data}}</p> 
     </ion-content> 
    </ion-tab>  
    </ion-tabs> 

</ion-view> 

Auf der zweiten Seite sieht die Ansicht Geschichte wie folgt aus:

Auf der dritten Seite, eine weitere Ansicht hinzugefügt:

VIEWS= 
{"002":{"viewId":"002","index":0,"historyId":"root","backViewId":null,"forwardViewId":"003","stateId":"first","stateName":"first","url":"/"}, 
"003":{"viewId":"003","index":1,"historyId":"root","backViewId":"002","forwardViewId":"004","stateId":"second","stateName":"second","url":"/second"}, 
"004":{"viewId":"004","index":2,"historyId":"root","backViewId":"003","forwardViewId":null,"stateId":"third","stateName":"third","url":"/third"}} 
BACK= 
{"viewId":"003","index":1,"historyId":"root","backViewId":"002","forwardViewId":"004","stateId":"second","stateName":"second","url":"/second"} 

Aber auf der vierten Seite, mit der ion-tabs bleibt die Ansichtsgeschichte gleich.

VIEWS= 
{"002":{"viewId":"002","index":0,"historyId":"root","backViewId":null,"forwardViewId":"003","stateId":"first","stateName":"first","url":"/"}, 
"003":{"viewId":"003","index":1,"historyId":"root","backViewId":"002","forwardViewId":"004","stateId":"second","stateName":"second","url":"/second"}, 
"004":{"viewId":"004","index":2,"historyId":"root","backViewId":"003","forwardViewId":null,"stateId":"third","stateName":"third","url":"/third"}} 
BACK= 
{"viewId":"003","index":1,"historyId":"root","backViewId":"002","forwardViewId":"004","stateId":"second","stateName":"second","url":"/second"} 

Ist das ein Bug mit $ionicHistory wenn ion-tabs mit oder bin ich etwas falsch in der Registerkarten Ansicht zu tun?

+0

Ich habe mehr oder weniger das gleiche Problem hier: http://stackoverflow.com/questions/28004332/ionic-tabs-and-side-menu-history. Haben Sie versucht, den vierten Zustand innerhalb des dritten zu platzieren? '.state ('third.fourth') {...' und dort navigieren '/ third/viertel' – Miquel

Antwort

1

Try ionen tabs einzuwickeln dieses Problem

<ion-view> 

    <div> 
    <ion-tabs class="tabs-balanced"> 
    <ion-tab title="Tab One"> 
     <ion-header-bar class="bar-balanced"> 
     <div class="buttons"> 
      <button class="button button-icon ion-ios-arrow-back" ng-click="prev()"></button> 
     </div> 
     <h1 class="title">Page 4 - Tab 1</h1> 
     </ion-header-bar> 

     <ion-content class="has-header"> 
      <h3>History</h3> 
      <p>{{data}}</p> 
     </ion-content> 
    </ion-tab> 

    <ion-tab title="Tab Two"> 
     <ion-header-bar class="bar-balanced"> 
     <div class="buttons"> 
      <button class="button button-icon ion-ios-arrow-back" ng-click="prev()"></button> 
     </div> 
     <h1 class="title">Page 4 - Tab 2</h1> 
     </ion-header-bar> 

     <ion-content class="has-header"> 
      <p>Content of tab 2.</p> 
     </ion-content> 
    </ion-tab> 

    </ion-tabs> 
    </div> 

</ion-view> 

http://plnkr.co/edit/pVDu9e7QZHzMt3A154i7?p=preview

0

Die ion-tabs einzuführen parallele Stapel zu vermeiden Geschichte jeden Register zu erhalten und so die $ionicHistory.goBack ändert den Vergangenheitszustand im aktuellen Stack. Sie können Ihr Problem lösen, indem Sie die Registerkarte entfernen oder Registerkarten zu allen Ansichten hinzufügen. Es gibt eine ausgezeichnete Erklärung dafür in diesem SO Post: https://stackoverflow.com/a/31385026/3878940

0

Was für mich funktionierte, war das Hinzufügen einer leeren Ionenansicht über Ion Tabs ganz oben auf der Seite.

Ich denke, dies "tricked" die $ ionicHistory zu glauben, dass meine Seite eine regelmäßige Ansicht statt eine Registerkartenansicht gerendert wurde.