【问题标题】:How to assign result of async pipe to variable without *ngIf in Angular 6如何在Angular 6中将异步管道的结果分配给没有*ngIf的变量
【发布时间】:2019-01-04 11:31:37
【问题描述】:

是否可以在没有 *ngIf 的情况下将 (areShipsExpanded$ | async) 分配给变量?因为如果这是标志true/false 当我有:*ngIf="(areShipsExpanded$ | async) as flag" 则按钮不会显示为假。

我想要这样的东西:

<button *let="(areShipsExpanded$ | async) as flag"
   (click)="expandAllShips(flag)">{{(flag ? "Collapse" : "Expand"}}
</button>

【问题讨论】:

  • 你为什么不做&lt;button (click)="expandAllShips(flag)"&gt;{{(areShipsExpanded$ | async ? "Collapse" : "Expand"}} &lt;/button&gt;
  • (click)="expandAllShips(flag) 因为那个?
  • 为什么不在组件中订阅areShipsExpanded$并将其分配给flag属性?
  • 当然可以,但我想知道是否可以直接从异步中进行:)
  • 这是stackoverflow.com/a/40751358/2604813 的另一种方式 --

标签: angular


【解决方案1】:

使用来自@ngrx/component*ngrxLet 指令

<ng-container *ngrxLet="observableNumber$ as n">
   <app-number [number]="n">
   </app-number>
</ng-container>

包含ngrxLet 指令的元素的可见性不受可观察表达式值的影响。

【讨论】:

    【解决方案2】:

    在这里聚会有点晚了,但我从medium article找到了一个很好的例子来说明如何做到这一点

    你仍然使用*ngIf,但你确保它总是通过传入一个带有你的可观察值作为属性的新对象来评估真实。

    <div *ngIf="{value1: myObs$ | async} as valuesObj">
        {{ valuesObject.value1 }}
    </div>
    

    IMO 这仍然有点 hacky,但比其他答案或创建自己的 *ngLet 指令要少得多。

    如文章中所述,这也是将多个对象属性中的多个可观察值组合在一起的好方法,因此您不必拥有多个 async 语句或嵌套 &lt;ng-container&gt; 元素。

    【讨论】:

      【解决方案3】:

      您可以使用ng-templateng-container 来完成此操作

      <ng-template #myTempl let-flag="areShipsExpand">
            <button
         (click)="expandAllShips(flag)">{{flag ? "Collapse" : "Expand"}}
        </button>
      </ng-template>
      
      <ng-container *ngTemplateOutlet="myTempl; context:{areShipsExpand: areShipsExpanded$ | async}"></ng-container>
      

      DEMO

      【讨论】:

        猜你喜欢
        • 2018-08-24
        • 1970-01-01
        • 2018-05-03
        • 2020-10-05
        • 1970-01-01
        • 2019-03-21
        • 2020-08-12
        • 1970-01-01
        • 2019-04-10
        相关资源
        最近更新 更多