Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
嵌套Angular2异步管道如何解析?_Angular - Fatal编程技术网

嵌套Angular2异步管道如何解析?

嵌套Angular2异步管道如何解析?,angular,Angular,我对angular2模板中嵌套异步管道的解析方式和解析时间感到有点困惑,而文档目前还不是很好,所以我希望so上的人能提供帮助 我有一个从服务返回的非常简单的Rxjs Observable,通过Observable.of(myArray).delay(2000)-延迟是用来帮助显示时间的变化 在我的模板中,我只是在上面返回的observable上使用一个异步管道,在一个封闭的标记中控制它何时显示,然后尝试在该标记中显示返回的数组长度: <p *ngIf="!(lists | async)"&

我对angular2模板中嵌套异步管道的解析方式和解析时间感到有点困惑,而文档目前还不是很好,所以我希望so上的人能提供帮助

我有一个从服务返回的非常简单的Rxjs Observable,通过
Observable.of(myArray).delay(2000)
-延迟是用来帮助显示时间的变化

在我的模板中,我只是在上面返回的observable上使用一个异步管道,在一个封闭的
标记中控制它何时显示,然后尝试在该
标记中显示返回的数组长度:

<p *ngIf="!(lists | async)">Waiting for lists...</p>
<p *ngIf="lists | async">We have lists! How many? => {{(lists | async)?.length}}</p>
等待列表

我们有列表!有多少?=>{{(列表|异步)?.length}

因此,当您加载此文件时,将显示“等待列表”,2秒后,我们将获得“we have lists!”部分,正如预期的那样,但内部异步管道需要另外2秒才能解析和显示解析的数组长度


我如何才能获得长度,使其与依赖于可观察对象返回其值的所有其他对象同时显示?或者这不是异步管道的一个好用例,我应该在我的组件中使用
subscribe()

异步管道很好。这个问题还牵涉到另一件事

检查指令源代码

当条件为true时,它将视图嵌入到视图容器中

this._viewContainer.createEmbeddedView(this._templateRef);
文件

基于templateRef实例化嵌入式视图,并将其插入到指定索引处的容器中

基本上,它接受NgIf中的任何内容,实例化它并将其放入DOM中

当条件为false时,它将从DOM中删除所有内容,并清除其中的所有视图

this._viewContainer.clear();
文件

销毁此容器中的所有视图

既然我们知道NgIf的作用,为什么你会看到这种行为?简单,我将分步骤进行解释

  • 等待列表…

    :此时
    列表
    结果尚未到达,因此执行此操作


  • 我有类似的问题,但有两个不同的观测值。为了使其正常工作,我将
    *ngIf=“list | async”
    替换为
    [隐藏]=“!(list | async)
    。这将在DOM中保留元素并更新数据。

    谢谢-这很有意义。在我的observable上使用
    delay()
    ,让我进一步了解
    *ngIf
    的工作原理:)也许还需要指出的是,源observable没有以任何方式共享这一事实也起到了重要作用。在原始场景中,
    列表
    可观察到的数据流被订阅两次(一次用于
    ngIf
    ,然后用于
    长度
    ),并且在每次订阅时,流都会重新启动,包括延迟。若
    列表
    被共享、重播或热处理,则第二次订阅将立即找到最终数组值,而不会产生新的延迟。
    *ngIf="lists | async" 
    ----(2 seconds)-----> 
    
                         (lists | async)?.length 
                         ------(2 seconds)----->   
                                                  print value