Angular Ionic UI-Router - 如何确保在嵌套状态下启动应用程序时加载所有父视图
Angular Ionic UI-Router - how to ensure all the parent views are loaded when starting the app in a nested state?
>我有一个ui-router
结构:
.state('app', {
url: '/app',
abstract: true,
templateUrl: 'menu.html',
})
.state('app.parent', {
url: '/parent',
views: {
'menuContent': {
templateUrl: 'parent.html',
}
}
})
.state('app.parent.next', {
url: '/next',
views : {
'next' : {
templateUrl: 'next.html'
}
}
})
parent.html
包含ui-view
和指向app.parent.next
的链接
<ion-view view-title="Parent">
<ion-nav-buttons side="secondary">
<button class="button" ng-click="$state.go('app.parent.next')">
next »
</button>
</ion-nav-buttons>
<ion-content has-header="true">
<h1>Parent</h1>
<div ui-view></div>
</ion-content>
</ion-view>
它工作得很好,但是如果我直接在app.parent.next
状态下启动应用程序,则标题和模板不存在。
- http://michalstefanow.com/ionic.html#/app/parent - 工作正常
- http://michalstefanow.com/ionic.html#/app/parent/next -
next
加载嵌套视图,它只是父视图中定义的ion-nav-buttons
不存在
(提供指向托管版本的链接,因为要重现它必须以嵌套状态启动)
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no, width=device-width">
<title></title>
<link data-require="ionic@1.2.4" data-semver="1.2.4" rel="stylesheet" href="https://code.ionicframework.com/nightly/css/ionic.css" />
<script data-require="ionic@1.2.4" data-semver="1.2.4" src="https://code.ionicframework.com/nightly/js/ionic.bundle.js"></script>
<script>
angular.module('starter', ['ionic'])
.config(function($stateProvider, $urlRouterProvider) {
$stateProvider
.state('app', {
url: '/app',
abstract: true,
templateUrl: 'menu.html',
})
.state('app.parent', {
url: '/parent',
views: {
'menuContent': {
templateUrl: 'parent.html',
}
}
})
.state('app.parent.next', {
url: '/next',
views : {
'next' : {
templateUrl: 'next.html'
}
}
})
// if none of the above states are matched, use this as the fallback
$urlRouterProvider.otherwise('/app/parent');
})
</script>
</head>
<body ng-app="starter">
<ion-nav-view></ion-nav-view>
<script type="text/ng-template" id="menu.html">
<ion-side-menus enable-menu-with-back-views="false">
<ion-side-menu-content>
<ion-nav-bar style="background-color: transparent !important;">
<ion-nav-back-button>
</ion-nav-back-button>
<ion-nav-buttons side="left">
<button class="button button-icon button-clear ion-navicon" menu-toggle="left">
</button>
</ion-nav-buttons>
</ion-nav-bar>
<ion-nav-view name="menuContent"></ion-nav-view>
</ion-side-menu-content>
<ion-side-menu side="left">
<ion-header-bar class="bar-stable">
<h1 class="title">Left</h1>
</ion-header-bar>
<ion-content>
<ion-list>
<ion-item menu-close href="#/app/parent">
Parent
</ion-item>
<ion-item menu-close href="#/app/parent/next">
Directly into next
</ion-item>
</ion-list>
</ion-content>
</ion-side-menu>
</ion-side-menus>
</script>
<script type="text/ng-template" id="parent.html">
<ion-view view-title="Parent">
<ion-nav-buttons side="secondary">
<button class="button" ui-sref='app.parent.next'>next »</button>
</ion-nav-buttons>
<ion-content has-header="true">
<h1>Parent</h1>
<h1>Parent</h1>
<h1>Parent</h1>
<div ui-view="next"></div>
</ion-content>
</ion-view>
</script>
<script type="text/ng-template" id="next.html">
<h1>Next</h1>
<h1>Next</h1>
<h1>Next</h1>
</script>
</body>
</html>
我已经尝试过纯ui-router
实现类似的东西:
- http://michalstefanow.com/ui-router.html#/app/parent
- http://michalstefanow.com/ui-router.html#/app/parent/child
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no, width=device-width">
<title>UI Router</title>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.7/angular.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular-ui-router/0.3.1/angular-ui-router.js"></script>
<script>
angular.module('starter', ['ui.router'])
.config(function($stateProvider, $urlRouterProvider) {
$stateProvider
.state('app', {
url: '/app',
abstract: true,
templateUrl: 'main.html',
})
.state('app.parent', {
url: '/parent',
views: {
'main': {
templateUrl: 'parent.html',
}
}
})
.state('app.parent.child', {
url: '/child',
templateUrl: 'child.html'
})
// if none of the above states are matched, use this as the fallback
$urlRouterProvider.otherwise('/app/parent');
});
</script>
</head>
<body ng-app="starter">
<div ui-view></div>
<script type="text/ng-template" id="main.html">
<h1>This is main.html</h1>
Below is:
<pre>ui-view="main"</pre>
<div ui-view="main"></div>
</script>
<script type="text/ng-template" id="parent.html">
<h1>Parent</h1>
<a ui-sref="app.parent.child">child »</a>
<div ui-view></div>
</script>
<script type="text/ng-template" id="child.html">
<h1>I am a child</h1>
</script>
</body>
</html>
推测猜测:由于缓存Ionic
特定的东西 - 使用 ui 路由器和离子选项卡时模板不会更新?
我到底想做什么?只是为了避免XY问题 - https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem - 我想指导用户上传图像。将有几个步骤,用户将直接进入状态app.upload.one
,而无需直接触摸app.upload
。 app.upload
将保持上传过程的当前状态,而每个步骤都将添加描述、标签等......
我认为Ionic是单页应用,所以只有一个父级(是root,像tabs
或menu
),其他的都是子级,特别重要的是其他人都是兄弟姐妹,所以不可能是父子关系。简而言之,您只能使用一个点表示法,例如app.child
,不喜欢app.child.grandchild
有两个点表示法。
相关文章:
- Phonegap handleOpenURL在应用程序启动(iOS)时未调用
- AngularJS-范围错误:''之后超过了最大调用堆栈大小;应用程序启动
- 从另一个应用程序启动一个MobileFirst应用程序,并在活动启动后接收活动
- 离子安卓应用程序启动后黑屏
- 当 SpringBoot 应用程序启动时吞咽
- 科尔多瓦 Phonegap 条形码插件无法从我的英特尔 XDK 应用程序启动
- 从网站/退出应用程序启动JavaScript
- 保存节点.js发布数据以显示自 Web 应用程序启动以来添加的所有记录
- 如何从node-webkit应用程序启动新应用程序
- 在应用程序启动时生成路由 URL 列表,并插入到 MVC 中的 javascript 文件中
- 自定义应用程序启动屏幕
- 如何从应用程序启动Blackberry World?[BB10]
- AngularJS在应用程序启动时加载数据
- AngularJS-在应用程序启动前处理路由
- Ionic:应用程序启动时角度控制器未运行
- 附加一个视图而不是在应用程序启动时显示它
- 如何通过Javascript从我的ionic应用程序启动谷歌地图的Intent API
- JavaScript动画像iPhone应用程序启动
- 当我的angularjs应用程序启动时,有没有办法防止加载初始状态
- Phonegap iPad应用程序启动/启动屏幕切换在devicereready