Ionic - 在另一个视图上刷新时不应用 CSS

Ionic - CSS is not applied when refreshing on another view

我目前正在开发我的第一个 Ionic 应用程序,并且是第一次使用 Angular。

我正在使用 pie-chart library 在应用程序的仪表板上显示图表。如果我在仪表板上刷新时效果很好,看起来像这样:

https://imgur.com/YUCAO6i,oakGp8c#1

但是如果我导航到另一个选项卡,比方说服务器选项卡,并在那里刷新,则宽度和高度不会应用于仪表板上的图表。相反,它们使用标准宽度和高度(500h x 900w 而不是 100h x 100w)呈现。 (见 imgur 上的第二张图片)。如果我再次在仪表板上刷新,它们将正常呈现。

我查看了库的源代码,看到在dashboard上刷新时,element[0].parentElement.offsetWidth等于100,但是在另一个视图上刷新时,它是0,所以使用默认值。在另一个视图上时,饼图指令似乎无法访问父级。

这里使用的HTML和CSS:

HTML

<div class="pieChart">
    <pie-chart data="server.chartData.cpu" options="chartOptions"></pie-chart>
</div>

CSS

.pieChart {
    height: 100px;
    width: 100px;
    float: left;
}

我花了几个小时试图找到答案,但我什至不确定我到底需要搜索什么。我想到的唯一解决方案是更改 pie-chart.js 中的默认值,我不想这样做。

编辑

该应用程序是开源的,您可以在我的存储库中找到完整代码:https://github.com/AndreasGassmann/cloudatcostapp

强制使用我假定的样式:

.pieChart {
    height: 100px !important;
    width: 100px !important;
    float: left !important;
}

经过几个小时的研究,我终于找到了问题的原因。

有 2 个不同的行为导致了这个问题:

  • Ionic 最多缓存 10 个视图以提高性能。这意味着当您从一个选项卡切换到另一个选项卡时,第一个选项卡保留在 DOM 中,因此可以更快地加载它。但是,似乎 CSS 样式未应用于不可见的视图。这意味着此时div和.pieChartclass的实际高度和宽度为0。我认为这类似于设置元素的 display: none 属性 。 (A blogpost explaining the issue with jquery)

  • 每当饼图更新时,它会将其大小设置为父元素的宽度和高度。我想这样做是为了让图表在您调整 window 大小并刷新数据后调整大小。

这两件事显然不能很好地结合在一起。由于 Ionic 缓存了仪表板视图,<pie-chart></pie-chart> 元素仍在 DOM 中,因此它将尝试立即重新呈现。但是因为样式没有应用到父级 div,它只会获得宽度和高度 0 并回退到使用默认值。

在普通网站中,视图通常不会被缓存。这意味着当您刷新时,<pie-chart></pie-chart> 元素不在 DOM 中,因此它根本不会尝试呈现。只有在您导航回视图并再次加载该元素后,它才会尝试呈现和读取其父元素的尺寸。 (这会起作用,因为应用了所有样式)。

我还没有找到一种方法可以告诉 "stay rendered" 一个元素,即使它不是活动视图。这意味着有 2 个选项可以解决这个问题(除了改变饼图库的工作方式之外):

  • 将高度和宽度硬编码为 pie-chart.js
  • 中的默认值
  • 在离子中禁用该视图的缓存或在每次刷新时清除视图缓存。您可以通过调用 $ionicHistory.clearCache()
  • 来完成此操作