Шаблон не обновляется при использовании ui-router и ion-tabs
CODE
http://codepen.io/hawkphil/pen/LEBNVB
У меня есть две страницы (link1
и link2
) из бокового меню. На каждой странице есть 2 вкладки:
link1
: tab 1.1
и tab 1.2
link2
: tab 2.1
и tab 2.2
Я использую ion-tabs
для каждой страницы, содержащей две вкладки.
Это очень простой дизайн: я хочу нажать link1
или link2
, чтобы перейти к соответствующему маршруту. Но по какой-то причине состояние изменилось правильно (см. Консоль), но фактический html-шаблон не обновился. Можете ли вы узнать, что неправильно и как исправить?
Кажется, что есть проблема с кешированием или что-то в этом роде.
HTML
<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>
<ion-side-menus enable-menu-with-back-views="false">
<ion-side-menu-content>
<ion-nav-bar class="bar-positive">
<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-buttons side="right">
<button class="button button-icon button-clear ion-navicon" menu-toggle="right">
</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-balanced">
<h1 class="title">Left</h1>
</ion-header-bar>
<ion-content>
<ion-list>
<ion-item nav-clear menu-close ui-sref="link1">
Link 1
</ion-item>
<ion-item nav-clear menu-close ui-sref="link2">
Link 2
</ion-item>
</ion-list>
</ion-content>
</ion-side-menu>
<ion-side-menu side="right">
<ion-header-bar class="bar-calm">
<h1 class="title">Right Menu</h1>
</ion-header-bar>
<ion-content>
<div class="list list-inset">
<label class="item item-input">
<i class="icon ion-search placeholder-icon"></i>
<input type="text" placeholder="Search">
</label>
</div>
<div class="list">
<a class="item item-avatar" href="#">
<img src="img/avatar1.jpg">
<h2>Venkman</h2>
<p>Back off, man. I'm a scientist.</p>
</a>
</div>
</ion-content>
</ion-side-menu>
</ion-side-menus>
</ion-side-menus>
<script id="link1.html" type="text/ng-template">
<ion-tabs class="tabs-icon-top tabs-positive">
<ion-tab title="Home" icon="ion-home">
<ion-view view-title="Home">
<ion-content has-header="true" has-tabs="true" padding="true">
<p>Test</p>
<p>Test Tab 1.1</p>
</ion-content>
</ion-view>
</ion-tab>
<ion-tab title="About" icon="ion-ios-information">
<ion-view view-title="Home">
<ion-content has-header="true" has-tabs="true" padding="true">
<p>Test</p>
<p>Test Tab 1.2</p>
</ion-content>
</ion-view>
</ion-tab>
</ion-tabs>
</script>
<script id="link2.html" type="text/ng-template">
<ion-tabs class="tabs-icon-top tabs-positive">
<ion-tab title="Home" icon="ion-home">
<ion-view view-title="Home">
<ion-content has-header="true" has-tabs="true" padding="true">
<p>Test</p>
<p>Test Tab 2.1</p>
</ion-content>
</ion-view>
</ion-tab>
<ion-tab title="About" icon="ion-ios-information">
<ion-view view-title="Home">
<ion-content has-header="true" has-tabs="true" padding="true">
<p>Test</p>
<p>Test Tab 2.2</p>
</ion-content>
</ion-view>
</ion-tab>
</ion-tabs>
</script>
JS
angular.module('ionicApp', ['ionic'])
.config(function($stateProvider, $urlRouterProvider) {
$stateProvider
.state('link1', {
url: "/link1",
views: {
'menuContent': {
templateUrl: "link1.html"
}
}
})
.state('link2', {
url: "/link2",
views: {
'menuContent': {
templateUrl: "link2.html"
}
}
});
$urlRouterProvider.otherwise("/link1");
})
.controller('AppCtrl', ['$scope', '$rootScope', '$state', '$stateParams', function($scope, $rootScope, $state, $stateParams) {
$rootScope.$on('$stateChangeSuccess', function(evt, toState, toParams, fromState, fromParams) {
console.log(toState);
});
}])
Ответы
Ответ 1
В настоящее время вы ссылаетесь на последнюю версию 1.0.0-rc.0
, которая имеет ошибку при переходе из одного состояния в другое, не загружая представление.
Дальнейшие исследования показали, что у них было 14 бета-версий от версии 1.0.0-beta.1
до 1.0.0-beta.14
после того, как они теперь находятся на версии 1.0.0-rc.0
, которая является кандидатом на выпуск.
nav-view
работает отлично до версии 1.0.0-beta.13
, но перестает работать после 1.0.0-beta.14
(которая является последней бета-версией),
Я предлагаю вам снизить вашу версию до 1.0.0-beta.13
, я знаю, что в зависимости от бета-версии это нехорошо, но до тех пор, пока не будет стабильной версии с ионной версией, вы должны полагаться на нее.
Working Codepen 1.0.0-beta.13
Update:
Ваша проблема заключается в том, что ваше представление кэшируется, потому что по умолчанию кэширование включено в вашем ионном приложении.
Прямо от Ionic Doc (последняя версия doc 1.0.0-beta.14)
По умолчанию представления кэшируются для повышения производительности. Когда вид переход от него, его элемент остается в DOM, и его область действия отключен от цикла $watch. При навигации к представлению, которое уже кэшируется, его область затем повторно подключается, и существующие элемент, который остался в DOM, становится активным. Это также позволяет сохранить положение прокрутки предыдущих просмотров. Максимальная емкость кэширования - 10.
Поэтому, упоминая cache: false
on $stateProvider
, указывается функция или отключает кэш навигационного представления глобально, выполняя $ionicConfigProvider.views.maxCache(0);
внутри angular фазу конфигурации.
Итак, в вашем случае это точная проблема, ваше первое представление получает кеш и показывает его снова и снова
Есть 3 способа решить эту проблему
1. Отключить кеш глобально
Отключите все кеширование, установив его в 0, прежде чем использовать его, добавьте зависимость $ionicConfigProvider
.
$ionicConfigProvider.views.maxCache(0);
Codepen
2. Отключить кеш в государственном провайдере
$stateProvider
.state('link1', {
url: "/link1",
cache: false,
views: {
'menuContent': {
templateUrl: "link1.html"
}
}
})
.state('link2', {
url: "/link2",
cache: false,
views: {
'menuContent': {
templateUrl: "link2.html"
}
}
});
Codepen
3. Отключить кеш с атрибутом
<ion-tab title="Home" icon="ion-home">
<ion-view cache-view="false" view-title="Home">
<!-- Ion content here -->
</ion-view>
</ion-tab>
<ion-tab title="About" icon="ion-ios-information">
<ion-view cache-view="false" view-title="Home">
<!-- Ion content here -->
</ion-view>
</ion-tab>
Codepen
Я считаю, что обновленный подход был бы полезен для реализации. Спасибо.
Проблема Github для той же проблемы ссылка здесь