gpt4 book ai didi

javascript - 手动转到上一个状态时 $ionicHistory.backView 的状态不正确

转载 作者:数据小太阳 更新时间:2023-10-29 05:51:57 25 4
gpt4 key购买 nike

我做了一个小实验:http://codepen.io/hawkphil/pen/NqMomm?editors=101

这是我的状态流程(点击按钮):Home -> Fact1 -> Fact2 -> Fact3 -> Fact2

在每次状态更改时,我都会在 console.log 中显示 $ionicHistory.backView但是,您可以在 pen.js:64 行中看到,奇怪的事情发生了。 $ionicHistory.backView“认为”我从后退按钮到达了 app.fact2,它显示 app.fact1 作为前一个状态(行 pen.js:53)。这是不正确的,对吧?它应该将 app.fact3 显示为之前的状态,因为我通过单击按钮进入 app.fact2 状态 MANUALLY。我还显示了 $timeout(行 pen.js:59)的值,以防它变慢。但它仍然不正确。

pen.js:56 stateChangeSuccess
pen.js:64 State change from: tabs.home to: tabs.fact1
pen.js:52 $scope.$watch $ionicHistory.backView change detect. newVal:
pen.js:53 tabs.home
pen.js:58 $timeout after 2 sec $ionicHistory.backView().stateName
pen.js:59 tabs.home
pen.js:56 stateChangeSuccess
pen.js:64 State change from: tabs.fact1 to: tabs.fact2
pen.js:52 $scope.$watch $ionicHistory.backView change detect. newVal:
pen.js:53 tabs.fact1
pen.js:58 $timeout after 2 sec $ionicHistory.backView().stateName
pen.js:59 tabs.fact1
pen.js:56 stateChangeSuccess
pen.js:64 State change from: tabs.fact2 to: tabs.fact3
pen.js:52 $scope.$watch $ionicHistory.backView change detect. newVal:
pen.js:53 tabs.fact2
pen.js:58 $timeout after 2 sec $ionicHistory.backView().stateName
pen.js:59 tabs.fact2
pen.js:56 stateChangeSuccess
pen.js:64 State change from: tabs.fact3 to: tabs.fact2
pen.js:52 $scope.$watch $ionicHistory.backView change detect. newVal:
pen.js:53 tabs.fact1
pen.js:58 $timeout after 2 sec $ionicHistory.backView().stateName
pen.js:59 tabs.fact1

问题

  1. 如何纠正这种行为?也许重写这个委托(delegate)或以某种方式覆盖它?

  2. 有解决方法吗?因为我依赖正确的先前状态来显示/隐藏某些东西。

JS

angular.module('ionicApp', ['ionic'])

.config(function($stateProvider, $urlRouterProvider) {

$stateProvider
.state('tabs', {
url: "/tab",
abstract: true,
templateUrl: "templates/tabs.html",
controller: "MainCtrl"
})
.state('tabs.home', {
url: "/home",
views: {
'home-tab': {
templateUrl: "templates/home.html",
controller: 'HomeTabCtrl'
}
}
})
.state('tabs.fact1', {
url: "/fact1",
views: {
'home-tab': {
templateUrl: "templates/fact1.html",
controller: 'Fact1TabCtrl'
}
}
})
.state('tabs.fact2', {
url: "/fact2",
views: {
'home-tab': {
templateUrl: "templates/fact2.html",
controller: 'Fact2TabCtrl'
}
}
})
.state('tabs.fact3', {
url: "/fact3",
views: {
'home-tab': {
templateUrl: "templates/fact3.html",
controller: 'Fact3TabCtrl'
}
}
})
.state('tabs.about', {
url: "/about",
views: {
'about-tab': {
templateUrl: "templates/about.html"
}
}
})
.state('tabs.navstack', {
url: "/navstack",
views: {
'about-tab': {
templateUrl: "templates/nav-stack.html"
}
}
});


$urlRouterProvider.otherwise("/tab/home");

})

.controller('MainCtrl', function($scope, $rootScope, $timeout, $ionicHistory) {
$scope.$watch(function() {
return $ionicHistory.backView() ? $ionicHistory.backView().stateName : null;
}, function (newVal, oldVal) {
console.log('$scope.$watch $ionicHistory.backView change detect. newVal:');
console.log(newVal);
});

$rootScope.$on('$stateChangeSuccess', function(event, toState, toParams, fromState, fromParams){
console.log('stateChangeSuccess');

$timeout(function(){
console.log('$timeout after 2 sec $ionicHistory.backView().stateName');
console.log($ionicHistory.backView().stateName);
}, 2000);
});
})

.controller('HomeTabCtrl', function($scope, $rootScope) {
// console.log('Home');

$rootScope.$on('$stateChangeSuccess', function(event, toState, toParams, fromState, fromParams){
console.log('State change from: ' + fromState.name + ' to: ' + toState.name);
});
})

.controller('Fact1TabCtrl', function($scope) {
// console.log('Fact1');
})

.controller('Fact2TabCtrl', function($scope) {
// console.log('Fact2');
})

.controller('Fact3TabCtrl', function($scope) {
// console.log('Fact3');
});

HTML

<html ng-app="ionicApp">

<head>
<meta charset="utf-8">
<meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no, width=device-width">

<title>Navigation Example</title>

<link href="//code.ionicframework.com/nightly/css/ionic.css" rel="stylesheet">
<script src="//code.ionicframework.com/nightly/js/ionic.bundle.js"></script>
</head>

<body>

<ion-nav-bar class="bar-positive">
<ion-nav-back-button class="button-icon ion-arrow-left-c">
</ion-nav-back-button>
</ion-nav-bar>

<ion-nav-view></ion-nav-view>


<script id="templates/tabs.html" type="text/ng-template">
<ion-tabs class="tabs-icon-top tabs-positive">

<ion-tab title="Home" icon="ion-home" href="#/tab/home">
<ion-nav-view name="home-tab"></ion-nav-view>
</ion-tab>

<ion-tab title="About" icon="ion-ios-football" href="#/tab/about">
<ion-nav-view name="about-tab"></ion-nav-view>
</ion-tab>

</ion-tab>

</ion-tabs>
</script>

<script id="templates/home.html" type="text/ng-template">
<ion-view view-title="Home">
<ion-content class="padding">
<p>
<a class="button icon ion-home" href="#/tab/home"> Home</a>
<a class="button icon icon-right ion-chevron-right" href="#/tab/fact1">
Fact1
</a>
<a class="button icon icon-right ion-chevron-right" href="#/tab/fact2">
Fact2
</a>
<a class="button icon icon-right ion-chevron-right" href="#/tab/fact3">
Fact3
</a>
</p>
</ion-content>
</ion-view>
</script>

<script id="templates/fact1.html" type="text/ng-template">
<ion-view view-title="Fact1">
<ion-content class="padding">
<p>
<a class="button icon ion-home" href="#/tab/home"> Home</a>
<a class="button icon icon-right ion-chevron-right" href="#/tab/fact1">
Fact1
</a>
<a class="button icon icon-right ion-chevron-right" href="#/tab/fact2">
Fact2
</a>
<a class="button icon icon-right ion-chevron-right" href="#/tab/fact3">
Fact3
</a>
</p>
</ion-content>
</ion-view>
</script>

<script id="templates/fact2.html" type="text/ng-template">
<ion-view view-title="Fact2">
<ion-content class="padding">
<p>
<a class="button icon ion-home" href="#/tab/home"> Home</a>
<a class="button icon icon-right ion-chevron-right" href="#/tab/fact1">
Fact1
</a>
<a class="button icon icon-right ion-chevron-right" href="#/tab/fact2">
Fact2
</a>
<a class="button icon icon-right ion-chevron-right" href="#/tab/fact3">
Fact3
</a>
</p>
</ion-content>
</ion-view>
</script>

<script id="templates/fact3.html" type="text/ng-template">
<ion-view view-title="Fact3">
<ion-content class="padding">
<p>
<a class="button icon ion-home" href="#/tab/home"> Home</a>
<a class="button icon icon-right ion-chevron-right" href="#/tab/fact1">
Fact1
</a>
<a class="button icon icon-right ion-chevron-right" href="#/tab/fact2">
Fact2
</a>
<a class="button icon icon-right ion-chevron-right" href="#/tab/fact3">
Fact3
</a>
</p>
</ion-content>
</ion-view>
</script>

<script id="templates/about.html" type="text/ng-template">
<ion-view view-title="About">
<ion-content class="padding">
<h3>Create hybrid mobile apps with the web technologies you love.</h3>
<p>Free and open source, Ionic offers a library of mobile-optimized HTML, CSS and JS components for building highly interactive apps.</p>
<p>Built with Sass and optimized for AngularJS.</p>
<p>
<a class="button icon icon-right ion-chevron-right" href="#/tab/navstack">Tabs Nav Stack</a>
</p>
</ion-content>
</ion-view>
</script>

<script id="templates/nav-stack.html" type="text/ng-template">
<ion-view view-title="Tab Nav Stack">
<ion-content class="padding">
<p><img src="http://ionicframework.com/img/diagrams/tabs-nav-stack.png" style="width:100%"></p>
</ion-content>
</ion-view>
</script>

</body>

</html>

最佳答案

github上打开的issues中有很多关于历史和导航的问题。

我想导航坏了,需要修复。

$ionicHistory 跟踪将每个访问过的 View 推送到堆栈上的 View 。实际上那里有 2 个数组:

$ionicHistory.viewHistory().views

$ionicHistory.viewHistory().histories

我想第一个是当前堆栈的 View 历史,而第二个考虑所有历史。
不同的导航可以有不同的历史:选项卡、侧边菜单等,当您从一个历史切换到另一个时,Ionic 应该记住每个状态。

阅读他们的 documentation你可以找到这个:

Unlike a traditional browser environment, apps and webapps have parallel independent histories, such as with tabs. Should a user navigate few pages deep on one tab, and then switch to a new tab and back, the back button relates not to the previous tab, but to the previous pages visited within that tab.

您可以在此处找到 currentHistoryId:$ionicHistory.currentHistoryId()

我已经稍微更改了您的示例,在进入主 Controller View 时显示 2 个数组:

.controller('MainCtrl', function($scope, $rootScope, $timeout, $ionicHistory) {
$scope.$on('$ionicView.enter', function(e) {
var history = $ionicHistory.viewHistory();
angular.forEach(history.views, function(view, index){
console.log('views: ' + view.stateName);
});
angular.forEach(history.histories[$ionicHistory.currentHistoryId()].stack, function(view, index){
console.log('history stack:' + view.stateName);
});
});
})

如您所见,第一个数组 views 跟踪您访问过的所有 View 。
如果您来回显示您之前访问过的 View ,则不会添加元素。

每个 View 都有两个属性:backViewIdforwardViewId。当元素添加到集合中时,这 2 个值似乎是 View 的一部分。它们在您导航时不会改变。

所以,当您遵循以下顺序时会发生什么:

Home -> Fact1 -> Fact2 -> Fact3 -> Fact2

Ionic 在集合中找到 View Fact2,获取它的 backViewId(它指向 Fact1),这就是它将用作查看以返回。

我没有在代码中进行一些调试,而是试图自己强制回看,但事情变得一团糟。

我猜他们选择这条路是因为当你回到根目录 - 主页 - 后退按钮应该被隐藏。当您按照以下顺序操作时,事情没有按预期进行:

我注意到的另一件事是,有时 View 会添加到此集合中,即使该元素已经存在。

你可以试试这个顺序:

Home -> Fact1 -> Fact2 - Home (button)

正如您现在看到的,后退按钮(在标题中)告诉您后 View 是 Fact2,实际上控制台显示的是相同的:

  • View :tabs.home
  • View :tabs.fact1
  • View :tabs.fact2
  • View :tabs.home
  • 历史堆栈:tabs.home
  • 历史堆栈:tabs.fact1
  • 历史堆栈:tabs.fact2
  • 历史堆栈:tabs.home

由于某些奇怪的原因,这次在集合中添加了一个新 View ,并且常规模式发生了变化。

有一个 codepen这里有一些测试。

关于javascript - 手动转到上一个状态时 $ionicHistory.backView 的状态不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31364578/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com