当前位置: 首页 > 知识库问答 >
问题:

角度2 ngrx可观测值

唐景山
2023-03-14

在我的商店里,我有一个名为“加载:布尔值”的值,它是假的,当对服务器的请求开始时,它变成了真,在重置或出错后,它又变成了假的。我在容器类中选择它,并将其作为属性传递给组件,如下所示:

@Component({
  template: `<some-component [isLoading]="isLoading"></some-component>`
})

class SomeContainer() {
  private isLoading: Observable<boolean>;
  constructor(private store: Store<IStore>) {
    this.isLoading = store.select(isLoadingSelector);
  }
}

我想将其用于一些有条件的内容:

class SomeComponent {
  @Input() private isLoading: Observable<boolean>;
  ...
}

<div>
  <span *ngIf="isLoading">Loading</span>
  <span *ngIf="!isLoading">Some data</span>
</div>

但是isLoding是可观察的,我必须得到这个逻辑的预期工作的布尔值。我找到的解决方案是在课堂上获得价值,就像这样:

private ngOnInit():void {
  this.isLoading.subscribe((value) => this.isLoadingBoolean = value);
}

并在模板中使用isLoadingBoolean。

但看起来很棘手。有没有更好的方法来解决这个问题(也许是使用*ngIF的async管道的方法)?

共有1个答案

汤博
2023-03-14

您可以在SomeContainer中使用async管道:

@Component({
  template: `<some-component [isLoading]="isLoading | async"></some-component>`
})
class SomeContainer() {
  private isLoading: Observable<boolean>;
  constructor(private store: Store<IStore>) {
    this.isLoading = store.select(isLoadingSelector);
  }
}

并且您的某物组件可以简化为使用布尔值输入:

@Component({
  template: `
    <div>
      <span *ngIf="isLoading">Loading</span>
      <span *ngIf="!isLoading">Some data</span>
    </div>
  `
})
class SomeComponent {
  @Input() private isLoading: boolean;
  ...
}

通常,处理容器中的可观察对象是一个好主意,这样组件就可以“哑”——请参见“表示和容器组件”。

 类似资料:
  • 我有一个服务,有一个方法foo。在该方法中,我订阅了一个可观察的(超文本传输协议-客户端)。 我喜欢从foo返回一个布尔值,该值取决于get。这不起作用,因为http.get是asynchrouns-在http.get完成之前调用return。 我怎样才能使这个同步? 编辑 返回可观察的布尔值在这里不是一个选项。这是因为我处理get in foo的响应(此处未显示),但我也需要根据它的返回来执行f

  • 我有一个HTTP请求,希望将结果共享给多个组件。当然,HTTP请求返回一个可观察的。我希望多个组件能够订阅此服务,而不会触发额外的HTTP请求。 我在一个组件中使用实现了这一点,该组件按需发出HTTP请求,并有另一种方法订阅该主题。虽然这是可行的,但似乎有些过分,而且肯定有更好的方法。 主题服务 和一个订户 和第二个订户 从管道链中删除时,会发出多个网络请求。是否有一种更优雅/正确的方式将观察到的

  • 学习角得到服务和组件和可观察性。 我正在尝试在我的演示应用程序中实现暗模式。该控件由一个服务完成,该服务根据浏览器默认值(如果找到)设置暗主题。 它在应用程序组件中初始化,以便以后在应用程序中放置控制开关。 暗模式从布尔值开始工作,因此为true或false。据我所知,使用一个可观察对象是不够的,因为我希望多个订阅者都以两种方式绑定到订阅,每种方式在服务中切换这些可观察对象。到目前为止,我很肯定这

  • 类定义为: 我继续创建对象: 使用以下工具进行检查: 打印: 但是在html模板中使用可以观察到: 引发: 如何解决这个问题?这里是Stackblitz项目的链接: https://stackblitz.com/edit/Angular-ivy-isebs7?file=src%2fapp%2fapp.component.ts

  • 我有一个沙盒,它订阅了一个消息流,我想过滤该流,以查找已发送到或从特定用户使用另一个组件中指定的路由参数接收的消息。 messages.sandbox.ts: messages.detail.container.ts this.matching消息$似乎只包括this.received消息$但是我知道this.sent消息$不是空,因为我可以在我的模板中使用它没有问题。 我是不是遗漏了一些合并观测

  • 我试图创建一个可观察变量,当localStorage变量发生更改时返回值。我的订户在更改localStorage(或内存中的变量)时没有获得新值。 流动看起来像 步骤 1 - 导航栏订阅用户服务(获取默认值 loggedIn=false) 步骤 2 - 身份验证组件更新用户服务(设置 loggedIn = true) 我在导航栏中的订阅未更新。我在这里错过了什么。我是否需要像事件发射器一样在Use

  • 以下代码未订阅: 但是如果我这样做,它确实订阅: 更新:这个工作太 但当我添加逻辑时,它并没有 我遵循RxJS官方文档:https://rxjs-dev.firebaseapp.com/api/operators/find 我甚至必须在,当我执行时,什么也不会打印出来。我也尝试过使用管道。 对象: 我传递的昵称是将对象与“Devpato”进行比较

  • 我想清除/deStory可观察到的是在服务中创建的。我看到一些帖子说也可以在服务中使用。 但是,这是一个好的做法和唯一的方式这样做,什么时候会被调用?请有人澄清一下。