【问题标题】:Add loading html if data not loaded in Angular如果数据未在 Angular 中加载,则添加加载 html
【发布时间】:2017-12-03 04:58:25
【问题描述】:

我们的应用中有很多组件。
某些组件需要来自服务器的数据,然后仅显示 html。
在没有数据到来之前,我们需要显示一些加载栏 html。

我想知道是否有任何通用的解决方案?
我可以开始将 *ngIf 放在每个组件中,但我正在考虑更通用的解决方案。

所以目前我正在考虑。

  1. 创建一个指令
  2. 在指令中传递对象
  3. 检查内部指令是否对象可用
  4. 如果它不可用,则在元素内添加一些 html。

到现在为止,下面的代码已经写好了。

@Directive({
  selector: '[appCustomLoad]'
})
export class CustomLoadDirective implements AfterViewInit{

  constructor(private templateRef: TemplateRef<any>,
              private viewContainer: ViewContainerRef,
              private renderer: Renderer,
              private el: ElementRef) {

  }

  @Input() set appCustomLoad(shouldAdd: boolean){
    // currently i am passing boolean for testing,
    // if i use this solution then i will change boolean to any.
    // and if object is not null or undefined then we will show loading bar with some msg.
    if(shouldAdd){
      this.viewContainer.createEmbeddedView(this.templateRef);
    }else{
      this.viewContainer.clear();
    }
  }

  ngAfterViewInit(): void {
    // after view init
  }
}

我无法使用指令在我的 div 中添加 html。

不确定这是不是正确的方法,所以如果您有任何更好的解决方案,请给我一些想法。 p>

【问题讨论】:

  • 您的组件架构是什么样的?我猜你可能会在你的根组件中执行你的请求,并用一个 ngIf 包装你需要隐藏的任何其他组件?

标签: javascript html angular


【解决方案1】:

有一种非常简单的通用方法可以做到这一点,但它并不那么优雅。解决方案是创建一个全局的 service.loading 变量:

 serviceTest.loading = 0;

然后在你检索的数据里面加1:

serviceTest.loading++;

现在你可以创建任何你想要的加载动画

ng-if="serviceTest.loading > 0"
    //display loading gif

检索数据后将值减一

serviceTest.loading--;

您使用整数而不是布尔值的原因是您希望支持多次检索。就像那个整数应该上升到 3 并且您不希望加载在所有 3 个请求都完成之前结束。

【讨论】:

  • 感谢您的回复。但可能是我没有以正确的方式提出问题,因为 1. 它的 angular 2 应用程序。 2. 如果数据不来那么我只想添加 html 而不是在 div 中显示数据。 3. 只是为了测试,我使用了布尔值,但我会做任何事情。因为可以有任何类型的对象传递给指令。
  • 好的,既然您使用的是 angular 2,rootscope 将变为服务,但概念仍然相同。我会更新我的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-02
  • 1970-01-01
  • 2012-09-19
  • 1970-01-01
  • 2015-12-01
  • 1970-01-01
  • 2012-09-02
相关资源
最近更新 更多