Ionic/AngularJS 的多级(子视图)路由
Posted
技术标签:
【中文标题】Ionic/AngularJS 的多级(子视图)路由【英文标题】:Multiple level (subview) routing at Ionic/AngularJS 【发布时间】:2021-10-22 22:09:26 【问题描述】:我尝试在访问后启用我的后退按钮
“科学事实 -> 更多事实 -> 见解类型 1”
但
我的应用需要浏览多级导航视图,从“#/tab/home”到“#/tab/facts2/insights1”。
我尝试做一些改变,发现如果我这样改变它可以工作:
<a class="button icon icon-right ion-chevron-right" ui-sref="tabs.facts2">More Facts</a>
到
<a class="button icon icon-right ion-chevron-right" ui-sref="tabs.facts2.insights1">More Facts</a>
不幸的是,我无法直接访问洞察 1 和洞察 2,因为我需要在 tabs.facts2 接收用户交互。
我的代码也可以在 codepen 访问这个link。
请问有人知道怎么解决吗?
angular.module('ionicApp', ['ionic'])
.config(function($stateProvider, $urlRouterProvider)
$stateProvider
.state('tabs',
url: "/tab",
abstract: true,
templateUrl: "templates/tabs.html"
)
.state('tabs.home',
url: "/home",
views:
'home-tab':
templateUrl: "templates/home.html",
controller: 'HomeTabCtrl'
)
.state('tabs.facts',
url: "/facts",
views:
'home-tab':
templateUrl: "templates/facts.html"
)
.state('tabs.facts2',
url: "/facts2",
views:
'home-tab':
templateUrl: "templates/facts2.html"
)
.state('tabs.facts2.insights1',
url: "/insights1/",
views:
'insights-tab':
templateUrl: "templates/insights1.html"
)
.state('tabs.facts2.insights2',
url: "/insights2/",
views:
'insights-tab':
templateUrl: "templates/insights2.html"
)
.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"
)
.state('tabs.contact',
url: "/contact",
views:
'contact-tab':
templateUrl: "templates/contact.html"
);
$urlRouterProvider.otherwise("/tab/home");
)
.controller('HomeTabCtrl', function($scope)
console.log('HomeTabCtrl');
);
<link href="https://cdn.jsdelivr.net/npm/@ionic/core/css/ionic.bundle.css" rel="stylesheet"/>
<script src="https://cdn.jsdelivr.net/npm/@ionic/core/dist/ionic/ionic.js"></script>
<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>Tabs 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>
</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-information" href="#/tab/about">
<ion-nav-view name="about-tab"></ion-nav-view>
</ion-tab>
<ion-tab title="Contact" icon="ion-ios-world" ui-sref="tabs.contact">
<ion-nav-view name="contact-tab"></ion-nav-view>
</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 icon-right ion-chevron-right" href="#/tab/facts">Scientific Facts</a>
</p>
</ion-content>
</ion-view>
</script>
<script id="templates/facts.html" type="text/ng-template">
<ion-view view-title="Facts">
<ion-content class="padding">
<p>Banging your head against a wall uses 150 calories an hour.</p>
<p>
<a class="button icon ion-home" href="#/tab/home"> Home</a>
<a class="button icon icon-right ion-chevron-right" ui-sref="tabs.facts2">More Facts</a>
</p>
</ion-content>
</ion-view>
</script>
<script id="templates/facts2.html" type="text/ng-template">
<ion-view view-title="Also Factual">
<ion-content class="padding">
<div class="button-bar">
<a class="button" nav-transition="none" ui-sref="tabs.facts2.insights1"> Insights Type 1</a>
<a class="button" nav-transition="none" ui-sref="tabs.facts2.insights2"> Insights Type 2</a>
</div>
<ion-nav-view name="insights-tab"></ion-nav-view>
</ion-content>
</ion-view>
</script>
<script id="templates/insights1.html" type="text/ng-template">
<ion-view view-title="Insights1">
<ion-content class="padding">
<p>HELLO WORLD 1</p>
</ion-content>
</ion-view>
</script>
<script id="templates/insights2.html" type="text/ng-template">
<ion-view view-title="Insights2">
<ion-content class="padding">
<p>HELLO WORLD 2</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="https://ionicframework.com/img/diagrams/tabs-nav-stack.png" style="width:100%"></p>
</ion-content>
</ion-view>
</script>
<script id="templates/contact.html" type="text/ng-template">
<ion-view title="Contact">
<ion-content>
<div class="list">
<div class="item">
@IonicFramework
</div>
<div class="item">
@Cordova
</div>
</div>
</ion-content>
</ion-view>
</script>
</body>
</html>
【问题讨论】:
【参考方案1】:逻辑缺陷是“洞察力”位于导航的顶层。
虽然您需要将“见解”嵌套到“事实”中,但使用嵌套的子路由(可以注意到脚本中断的位置)。虽然很难说更多,除非能够看到router's 调试输出。
【讨论】:
您知道如何使“insights1”成为“facts2”的子项或任何其他解决方法吗? @vinoli 如前所述,“带有嵌套的子路由”。不要让这些数字成为字符串的一部分以匹配......因为路由器知道:id
。所以我会说 insights
-> :id
和 :id/facts
。有几种可能性(通常是组件和加载子组件的组合)。这很棘手,这就是日志记录很重要的原因。还是最简单的,路由 URL 1:1 代表嵌套路由。以上是关于Ionic/AngularJS 的多级(子视图)路由的主要内容,如果未能解决你的问题,请参考以下文章
在保持 N 级或多级可展开列表视图的折叠/展开状态后,某些子组不会显示
如何实现滑动,捕捉移动页面(ionic + angularjs)
iOS 的 Ionic/AngularJS/Phonegap 键盘问题
ionic+AngularJS系列知识——什么是AngularJS