2015-09-07 86 views
0

我试图做使用离子与像这样结构的混合应用:离子不同的标签内容

#/app     (sidemenu.html) 
#/app/noTabContent1 (notab-content1.html) 
#/app/noTabContent2 (notab-content2.html) 
#/app/tab1   (tab1.html) 
#/app/tab1/content1 (tab1-content1.html) 
#/app/tab1/content2 (tab1-content2.html) 
#/app/tab2   (tab2.html) 
#/app/tab2/content1 (tab2-content1.html) 
#/app/tab2/content2 (tab2-content2.html) 

的问题是,它似乎像标签页之间的冲突。例如,如果我第一次访问tab1内容页,那么我稍后访问tab2内容页时,它仍会显示tab1内容。如果我先访问tab2内容页面,则无论我如何尝试访问tab1内容页面,它都将始终显示tab2内容。

这是为什么?我的构造错了吗?或者,它是离子虫?我如何克服它?

编辑:这里是为了更容易理解我的例子代码:

的index.html:

<!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> 

    <!-- ionic/angularjs js --> 
    <link href="http://code.ionicframework.com/1.1.0/css/ionic.css" rel="stylesheet"> 
    <script src="http://code.ionicframework.com/1.1.0/js/ionic.bundle.js"></script> 

    <!-- your app's js --> 
    <!--<script src="js/app.js"></script> 
    <script src="js/controllers.js"></script>--> 
    </head> 
    <body ng-app="starter"> 
    <ion-nav-view></ion-nav-view> 

    <!-- MENU Template --> 
    <script id="templates/menu.html" type="text/ng-template"> 
     <ion-side-menus enable-menu-with-back-views="false"> 
    <ion-side-menu-content> 
    <ion-nav-bar class="bar-stable"> 
     <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/content1"> 
      Content 1 
     </ion-item> 
     <ion-item menu-close href="#/app/content2"> 
      Content 2 
     </ion-item> 
     <ion-item menu-close href="#/app/tab/content1"> 
      Tab 1 Content 1 
     </ion-item> 
     <ion-item menu-close href="#/app/tab/content2"> 
      Tab 1 Content 2 
     </ion-item> 
     <ion-item menu-close href="#/app/tab2/content1"> 
      Tab 2 Content 1 
     </ion-item> 
     <ion-item menu-close href="#/app/tab2/content2"> 
      Tab 2 Content 2 
     </ion-item> 
     </ion-list> 
    </ion-content> 
    </ion-side-menu> 
</ion-side-menus> 

    </script> 

    <!-- Tab1 Template --> 
    <script id="templates/tab1.html" type="text/ng-template"> 
     <ion-tabs class="tabs-top tabs-color-active-positive"> 

    <ion-tab title="Tab1 - Content1" icon-off="ion-ios-pulse" icon-on="ion-ios-pulse-strong" href="#/app/tab/content1"> 
    <ion-nav-view name="tab-Content"></ion-nav-view> 
    </ion-tab> 

    <ion-tab title="Tab1 - Content2" icon-off="ion-ios-chatboxes-outline" icon-on="ion-ios-chatboxes" href="#/app/tab/content2"> 
    <ion-nav-view name="tab-Content2"></ion-nav-view> 
    </ion-tab> 

</ion-tabs> 
    </script> 

    <!-- Tab2 Template --> 
    <script id="templates/tab2.html" type="text/ng-template"> 
     <ion-tabs class="tabs-top tabs-color-active-positive"> 

    <ion-tab title="Tab2 - Content1" href="#/app/tab2/content1"> 
    <ion-nav-view name="tab2-Content"></ion-nav-view> 
    </ion-tab> 

    <ion-tab title="Tab2 - Content2" href="#/app/tab2/content2"> 
    <ion-nav-view name="tab2-Content2"></ion-nav-view> 
    </ion-tab> 

</ion-tabs> 
    </script> 

    <!-- Content1 Template --> 
    <script id="templates/content1.html" type="text/ng-template"> 
     <ion-view view-title="Content 1"> 
    <ion-content> 
    <h1>Content 1</h1> 
    </ion-content> 
</ion-view> 
    </script> 

    <!-- Content2 Template --> 
    <script id="templates/content2.html" type="text/ng-template"> 
     <ion-view view-title="Content 2"> 
    <ion-content> 
    <h1>Content 2</h1> 
    </ion-content> 
</ion-view> 
    </script> 


    </body> 
</html> 

app.js

// Ionic Starter App 

// angular.module is a global place for creating, registering and retrieving Angular modules 
// 'starter' is the name of this angular module example (also set in a <body> attribute in index.html) 
// the 2nd parameter is an array of 'requires' 
angular.module('starter', ['ionic']) 

.run(function($ionicPlatform) { 
    $ionicPlatform.ready(function() { 
    // Hide the accessory bar by default (remove this to show the accessory bar above the keyboard 
    // for form inputs) 
    if(window.cordova && window.cordova.plugins.Keyboard) { 
     cordova.plugins.Keyboard.hideKeyboardAccessoryBar(true); 
     cordova.plugins.Keyboard.disableScroll(true); 
    } 
    if(window.StatusBar) { 
     StatusBar.styleDefault(); 
    } 
    }); 
}) 

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

    .state('app', { 
    url: '/app', 
    abstract: true, 
    templateUrl: 'templates/menu.html', 
    //controller: 'AppCtrl' 
    }) 

    .state('app.tab', { 
    url: '/tab', 
    views:{ 
      'menuContent':{ 
       templateUrl: 'templates/tab1.html' 
      } 
     } 
    }) 
    .state('app.tab2', { 
    url: '/tab2', 
    views:{ 
      'menuContent':{ 
       templateUrl: 'templates/tab2.html' 
      } 
     } 
    }) 


    .state('app.content1', { 
     url: '/content1', 
     views: { 
     'menuContent': { 
      templateUrl: 'templates/content1.html' 
     } 
     } 
    }) 
    .state('app.content2', { 
     url: '/content2', 
     views: { 
     'menuContent': { 
      templateUrl: 'templates/content2.html' 
     } 
     } 
    }) 
    .state('app.tab.content1', { 
     url: '/content1', 
     views: { 
     'tab-Content': { 
      templateUrl: 'templates/content1.html' 
     } 
     } 
    }) 
.state('app.tab.content2', { 
     url: '/content2', 
     views: { 
     'tab-Content2': { 
      templateUrl: 'templates/content2.html' 
     } 
     } 
    }) 

.state('app.tab2.content1', { 
     url: '/content1', 
     views: { 
     'tab2-Content': { 
      templateUrl: 'templates/content1.html' 
     } 
     } 
    }) 
.state('app.tab2.content2', { 
     url: '/content2', 
     views: { 
     'tab2-Content2': { 
      templateUrl: 'templates/content2.html' 
     } 
     } 
    }) 

    // if none of the above states are matched, use this as the fallback 
    $urlRouterProvider.otherwise('/app/content1'); 
}); 

http://codepen.io/anon/pen/LpVVOr?editors=101

+0

您需要提供导航代码以了解发生了什么问题。如果可能的话制作一个代码簿。 –

+0

@KaranKumar我在codepen中创建了一个示例代码,以便于理解情况。请参考它。谢谢。 – user1995781

+0

@KaranKumar如果您看不到问题,请在使用其中一个标签页进行测试时刷新页面。任何想法如何解决它? – user1995781

回答

1

欢迎的世界神秘的离子导航。 我想没有人能够掌握这个奇怪的野兽,并且希望有人在某个时候能够解决这个问题......或者甚至更好地重写它。

Loadsquestions已被询问有关此主题和更多的论坛;关于这个问题的问题已经出现,等待了很长时间,但没有明确的答案。

奇怪的是,甚至创作者都没有得到正确的解释,或者会回答这些问题。

无论如何,回到你的问题。使其工作的唯一方法是禁用缓存系统。

缓存

默认情况下,意见被缓存以提高性能。当一个视图从 导航离开时,其元素将留在DOM中,其范围为 与$ watch周期断开连接。当导航到已经缓存的视图 时,其范围将重新连接,并且留在DOM中的现有元素将成为活动视图。这也可以保持先前视图的滚动位置。

可以通过多种方式禁用和启用缓存。默认情况下,Ionic将缓存最多10个视图,并且不仅可以配置 ,而且应用程序还可以明确指出应该缓存哪些视图和不应缓存哪些视图。

请注意,因为我们正在缓存这些视图,所以我们不会销毁 范围。相反,示波器正在与观察周期断开。 因为示波器没有被破坏和重新创建,所以在随后的查看中,控制器不会再次加载 。如果应用程序/控制器需要 来知道视图何时进入或已经离开,那么查看ionView范围发出的 事件(例如$ ionicView.enter)可能会很有用。

每个视图都被缓存 - 这是完全正确的 - 但是当你开始搞乱标签或菜单时,事情就会失去控制。

如果你真的想解决你的问题,只需禁用每个状态的缓存。有几个选项存在,但只有我发现便于管理它设置cache: false当你配置你的状态:

.state('app', { 
    cache: false, 
    url: '/app', 
    abstract: true, 
    templateUrl: 'templates/menu.html', 
    }) 

所有状态和事情就禁用缓存将正常工作。

这是你的工作Plunker

+0

有趣的答案,我有与$ ionicModals相同的经验。显然,它们按照它们打开的顺序被缓存。所以当我做了一些模态间的开放。 (以疯狂的方式从其他模式中打开一个模态),离子模态在当前模态后面打开。是非常奇怪的行为。创作者应该研究它。 –