Angular 4 - 检查是否所有页面资源都已完全加载(使加载器旋转直到所有资源都已完全加载)

新手上路,请多包涵

我正在为我的 Angular 应用程序创建一个加载器。

最常见的方法是在订阅 http 请求时传递布尔参数,但我的服务的响应是一系列图像 URL,因为页面充满了图像。

因此,当检索到 URL 时加载程序停止,但由于连接速度慢,用户会因为图像尚未完成加载而感到恼火。

我曾尝试使用 Javascript 的加载事件来监听我的资源何时完成加载,以便我可以在那时停止加载程序,但似乎我无法从监听器函数中操作加载程序的值。

这是我尝试过的:

 //the TS component
isLoading: boolean;

ngOnInit() {
this.isLoading = true;
this.checkIfLoaded();
}

checkIfLoaded() {
  window.addEventListener("load", function (event) {
    console.log("All resources finished loading!");
    //here i should do something, either returning false or...
    //...manipulating the isLoading, but i can't access isLoading from here
  });
}

//the template
<ng-container *ngIf="isLoading">
   <app-spinner></app-spinner>
</ng-container>

环境:Angular 4.4 非常感谢任何帮助,谢谢

原文由 hzbarkan 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 578
2 个回答

只需使您的组件实施 AfterViewInit false 设置 ngAfterViewInit() isLoading

 class YourComponent implements AfterViewInit {
    // ...
    ngAfterViewInit() {
        this.isLoading = false;
    }
}

无需附加额外的事件处理程序,angular 完全覆盖了它的生命周期回调。

原文由 baao 发布,翻译遵循 CC BY-SA 4.0 许可协议

您的问题是您没有绑定到正确的事件。

如果你想知道图片是否已经加载,你需要创建它们并等待它们加载。

从获取图片开始,然后创建 HTML 元素来加载它们,然后等待所有图片加载完毕,最后显示它们:

 haveImagesLoaded: boolean[];

this.myService.getPictures().subscribe((urls: string[]) => {
  // no image has loaded, put them all to false
  this.haveImagesLoaded = urls.map(url => false);

  // Iterate over the images
  urls.forEach((url, index) => {
    // Create an HTML image
    let img = new Image();
    // Listen to its loading event
    img.onload = () => {
      // Image has loaded, save the information
      this.haveImagesLoaded[index] = true;
      // If all images have loaded, set your loader to false
      this.isLoading = !this.haveImagesLoaded.some(hasLoaded => !hasLoaded);
    };
  });
  // trigger the loading of the image
  img.src = url;
});

之后,您可以使用您选择的方法自由显示它们。

原文由 user4676340 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题