【问题标题】:Template does not update when using ui-router and ion-tabs使用 ui-router 和 ion-tabs 时模板不更新
【发布时间】:2024-05-21 00:00:01
【问题描述】:

代码

http://codepen.io/hawkphil/pen/LEBNVB

我在侧边菜单中有两页(link1link2)。每页有 2 个标签:

link1tab 1.1tab 1.2

link2tab 2.1tab 2.2

我为每个页面使用ion-tabs 以包含 2 个选项卡。

这是一个非常简单的设计:我想点击link1link2 去合适的路线。但由于某种原因,状态已正确更改(请参阅控制台),但实际的 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);
  });

}])

【问题讨论】:

    标签: javascript html angularjs angular-ui-router ionic-framework


    【解决方案1】:

    您当前指的是最新版本1.0.0-rc.0,它在从一种状态转换到另一种状态时存在错误,它没有加载视图。

    进一步的研究发现,在他们现在的版本为1.0.0-rc.0(这是候选版本)之后,他们有 14 个 beta 版本,从版本 1.0.0-beta.11.0.0-beta.14

    nav-view1.0.0-beta.13 版本之前工作完美,但在1.0.0-beta.14(这是最后一个测试版)之后停止工作,

    我建议你将你的版本降级到1.0.0-beta.13,我知道依赖 beta 版本不是一件好事,但在 ionic 发布稳定版本之前你必须依赖它。

    Working Codepen1.0.0-beta.13

    更新:

    您的问题是您的视图正在被缓存,因为默认情况下,您的 ionic 应用程序中启用了缓存。

    直接来自Ionic Doc(最新版本文档 1.0.0-beta.14)

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

    因此,通过在 $stateProvider 状态功能上提及 cache: false 或通过在角度配置阶段执行 $ionicConfigProvider.views.maxCache(0); 全局禁用导航视图缓存。

    所以在您的情况下,这正是问题所在,您的第一个视图正在获取缓存并再次显示它

    有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 issue 为同一问题link here

    【讨论】:

    • 哦,这很奇怪...有人向 Ionic github 提交了错误吗?
    • @HP.我没有找到这样的
    • @HP。请检查我更新的方法,这将是很好的实施而不会造成任何伤害。谢谢..
    • 遇到了同样的问题,解决方案 #1 对我不起作用,必须在受影响的路线上使用解决方案 #2。我想再次感谢@pankajparkar 帮助我找到了这个。 *.com/questions/30110598/…
    • 顺便说一下,我在 ionic github 上打开了这个 bug:github.com/driftyco/ionic/issues/3684