【问题标题】:Ionic 3 : How to preload tabs?Ionic 3:如何预加载标签?
【发布时间】:2018-02-27 21:13:54
【问题描述】:

我处于一种特殊情况,我绝对需要确保在用户进入应用程序之前定义了document.querySelectorAll('.scroll-content')[0]document.querySelectorAll('.scroll-content')[1] 等。换句话说:我需要预加载我的标签

标签的当前行为:

  • doc...All('.scroll-content')[0] 已定义。
  • doc...All('.scroll-content')[1] 未定义。
  • doc...All('.scroll-content')[2] 未定义。
  • doc...All('.scroll-content')[3] 未定义。

这种“状态”的原因是一个标签页的内容只有在被访问时才会被加载。

我期望的标签行为

  • doc...All('.scroll-content')[0] 已定义。
  • doc...All('.scroll-content')[1] 已定义。
  • doc...All('.scroll-content')[2] 已定义。
  • doc...All('.scroll-content')[3] 已定义。

所以我需要能够在用户第一次访问标签页之前加载它们。

Sadly the ionic team did remove the preloading of tabs in beta 12 because supposedly the AOT compilation is fast enough for us "not to need" to preload tabs. ????

I also tried to set my @IonicPages priority to high and specifying that I want to preload modules in app.module.ts.

没有成功。

有什么想法吗?

PS:请不要在显示内容之前以编程方式选择每个选项卡等丑陋的东西。 ????

编辑:我仍在寻找一个干净的解决方法,但我也发布了feature request on github。欢迎参与。

【问题讨论】:

  • 您是否尝试过不使用 Ionic Page(延迟加载)?
  • 是的,我做到了...:/

标签: javascript angular ionic-framework ionic2 preload


【解决方案1】:

请注意,我是根据自己的经验发言。

背景: 我遇到了非常相似的方法,我使用一些外部引擎在页面上呈现一些内容,并且需要在 Angular 组件中引用由它生成的 HTML。问题在于将代码放在 view init 生命周期函数中是不够的。

可能的解决方案:

  1. 您可以使用 setTimeout 等待 HTML 呈现
  2. 您可以点击 ngDoCheck 并检查 HTML 是否已呈现(如果 document.querySelector 是真实的,那么您知道您可以转到您的脚本)。
  3. 点击`ngDoCheck 是昂贵的(在您初始加载后,您的检查仍将被触发)。因此,最好结合使用 while 循环和 setTimeout。请参阅下面的伪代码:

-

ngOnViewInit() {
  let isReady = false;
  do {
    if (document.querySelectorAll('.scroll-content').length > 0) {
      isReady = true;
    }
  while (!isReady);
  this.runMyCodeThatNeedsThePagePreloaded();
}

【讨论】:

  • 嗨!谢谢您的回答。不幸的是,在这种情况下它不起作用。我将在我的问题中添加进一步的解释。
【解决方案2】:

如果您使用 AOT 并且 ionic 团队是正确的(它足够快),我看不出您为什么要预加载标签。除了可能是因为你想获取一些数据?

如果是加载数据,您可以在 tabService 中获取数据,您可以将其注入每个选项卡中。

【讨论】:

  • 嗨!谢谢你的回答。这是一个纯粹的动画问题。我正在为两个选项卡之间的标题设置动画。标题具有 50% 的不透明度背景。即使是第一次使用 AOT,选项卡加载速度也足够慢,​​以至于两个页面中的两个标题叠加在一起,这会在一秒钟内产生难看的白色闪烁。加载选项卡时不会发生这种情况,因此如果未加载所选选项卡,我将通过隐藏 ionViewWillLeave 上的标题来解决此问题。我宁愿只预加载标签 x)
  • 如果你使用延迟加载,你可以试试这个:angular.io/api/router/PreloadAllModules
  • 这个问题在实际设备上吗?还是在模拟器上?
  • 在设备上,iOS 11 (iPhone 6S)
  • 在如此强大的设备上闪一整秒让我怀疑你在其他地方有问题。您能否尝试注释掉您的应用程序的大部分内容,看看它是否有所作为?
猜你喜欢
  • 1970-01-01
  • 2020-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-08
  • 1970-01-01
  • 2014-07-28
  • 2018-07-07
相关资源
最近更新 更多