NgrxStore 和 Angular - 大量使用异步管道或在构造函数中仅订阅一次

2024-04-06

我开始查看 ngrx Store,并看到使用 Angular 异步管道的便利性。同时我不确定大量使用 Angular 异步管道是否是一个不错的选择。

我举一个简单的例子。假设在同一个模板中,我需要显示从商店检索的对象(例如人员)的不同属性。

一段模板代码可以是

<div>{{(person$ | async).name}}</div>
<div>{{(person$ | async).address}}</div>
<div>{{(person$ | async).age}}</div>

而组件类构造函数将具有

export class MyComponent {
  person$: Observable<Person>;

  constructor(
    private store: Store<ApplicationState>
  ) {
      this.person$ = this.store.select(stateToCurrentPersonSelector);
  }
.....
.....
}

据我了解,这段代码意味着对同一个 Observable 的 3 个订阅(通过异步管道在模板中进行)(person$).

另一种方法是定义 1 个属性 (person)在 MyComponent 中并且只有 1 个订阅(在构造函数中)来填充该属性,例如

export class MyComponent {
  person: Person;

  constructor(
    private store: Store<ApplicationState>
  ) {
      this.store.select(stateToCurrentPersonSelector)
                .subscribe(person => this.person = person);
  }
.....
.....
}

而模板使用标准属性绑定(即没有异步管道),例如

<div>{{person.name}}</div>
<div>{{person.address}}</div>
<div>{{person.age}}</div>

现在问题

这两种方法在性能方面有什么区别吗?大量使用异步管道(即大量使用订阅)是否会影响代码的效率?


两者都不应该将您的应用程序编写为智能组件和演示组件。

优点:

  • 所有业务逻辑都在智能控制器上。
  • 只需订阅一个
  • 可重复使用性
  • 呈现控制器只有一个职责,只呈现数据,并不知道数据从哪里来。 (松散耦合)

回答最后一个问题:

大量使用异步管道会影响效率,因为它会订阅每个异步管道。如果您调用 http 服务,您会更注意到这一点,因为它将调用每个异步管道的 http 请求。

智能组件

@Component({
  selector: 'app-my',
  template: `
      <app-person [person]="person$ | async"></app-person>
`,
  styleUrls: ['./my.component.css']
})
export class MyComponent implements OnInit {

    person$: Observable<Person>;

    constructor(private store: Store<ApplicationState>) {}

    ngOnInit() {
        this.person$ = this.store.select(stateToCurrentPersonSelector);
    }

}

演示组件

@Component({
  selector: 'app-person',
  template: `
    <div>{{person.name}}</div>
    <div>{{person.address}}</div>
    <div>{{person.age}}</div>
`,
  styleUrls: ['./my.component.css']
})
export class PersonComponent implements OnInit {

    @Input() person: Person;

    constructor() {}

    ngOnInit() {
    }

}

欲了解更多信息,请检查:

  • https://medium.com/@dan_abramov/smart-and-dumb-components-7ca2f9a7c7d0#.u27zmzf25 https://medium.com/@dan_abramov/smart-and-dumb-components-7ca2f9a7c7d0#.u27zmzf25
  • http://blog.angular-university.io/angular-2-smart-components-vs-presentation-components-whats-the-difference-when-to-use-each-and-why/ http://blog.angular-university.io/angular-2-smart-components-vs-presentation-components-whats-the-difference-when-to-use-each-and-why/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

NgrxStore 和 Angular - 大量使用异步管道或在构造函数中仅订阅一次 的相关文章

随机推荐

  • Android Java rxjava 线程抓取网页

    我必须抓取一个网页 我必须获取所有具有data component type等于s search result并将它们放入PC类型的ArrayList中 它具有一些属性 但我不知道如何使用 Retrofit 进行解析 有人可以帮我吗 RxJ
  • 柯里化和部分应用有什么区别?

    我经常在互联网上看到各种抱怨 认为其他人的柯里化示例不是柯里化 而实际上只是部分应用 我还没有找到关于什么是部分应用或者它与柯里化有何不同的合理解释 似乎存在普遍的混乱 等效的示例在某些地方被描述为柯里化 而在其他地方则被描述为部分应用 有
  • 雄辩的push()和save()区别

    我读过关于 eloquent 的 laravel 4 文档 并且对 Push 部分很感兴趣 它说 有时您可能不仅希望保存模型 还希望保存其所有关系 为此 您可以使用推送方法 保存模型和关系 user gt push 请参阅此处的链接 htt
  • Maven - 在当前项目中找不到前缀“wildfly”的插件

    我正在使用 Wildfly 8 我需要使用 JSR 352 中的 java 批处理处理器 我从以下位置下载了示例https github com javaee samples javaee7 samples https github com
  • 通过 BASH 将空格替换为下划线

    假设我有一个字符串 str 我希望编辑 str 使其中的所有空格都替换为下划线 Example a hello world 我想要的最终输出 echo a to be 你好世界 您可以尝试以下操作 str str
  • 如何在 VScode 中使用带有 R 内核的 Jupyter Notebook?

    现在我可以在 Web 浏览器中使用带有 R kernal 的 jupyter lab 并使用 VS Code 使用 python kernal 编辑 jupyter Notebook 代码 是否可以使用 Jupyter Notebook 模
  • Django 管理加载没有 CSS

    我创建了一个新的 Django 应用程序 我注意到它的管理页面加载时没有 CSS 我设置了STATIC URL和STATIC ROOT在settings py中根据this https stackoverflow com questions
  • SQL Server中模拟Oracle的CONNECT BY PRIOR

    如何在SQL Server 2000 2005 2008中获得Oracle的CONNECT BY PRIOR功能 实现递归查询的 SQL 标准方法 例如实现的通过 IBM DB2 和SQL服务器 http msdn microsoft co
  • 处理 Scalaz6 验证列表

    在 Scalaz6 中是否有一种惯用的方法来处理验证集合 val results Seq Validation A B val exceptions results collect case Failure exception gt exc
  • 更改 ggplot2 中堆叠填充列的顺序

    我想更改堆积条形图的顺序 例如 在mpg我想订购c 4 r f 是改变因素水平的唯一方法吗 library ggplot2 library dplyr s lt ggplot mpg aes fl fill drv geom bar pos
  • PDFsharp 换行符

    我正在尝试换新线路 但如果我使用 n这是行不通的 任何通过向字符串添加一些内容来获得新行的方法 r n 这也不起作用 gfx DrawString Project No n textBoxProjNumber Text fontUnder
  • 为什么 haskell 模式会踩到 s-lower-camel-case 以及它是如何做到的?

    我准备了一个最小的工作示例来检查其他依赖项是否没有干扰这一点 测试函数为 defun test haskell problems interactive insert s lower camel case other string 问题的完
  • django 以每周、每月、每日的方式对查询元素进行排序

    我正在获取人员列表以及他们从同一项目中的 api 进行的测试 我希望用户可以选择查看某个城市中进行的测试数量 并提供三个选项 每日 每周 每月 models py class City models Model city name mode
  • 如何在非静态函数中为静态变量赋值?

    基本上 ajax在 aspx 中 每 1000 毫秒轮询一次从 cs 返回的值WebMethod在 cs 中是static GetData 属性被声明为静态public static int Percent get set 我想要做的是当单
  • NuGet 文件标记中的可选或条件文件夹?

    我想做 MsBuild 所做的事情 设置 nuspec 文件中引用的文件的条件 基本上它看起来像这样
  • C# Winforms 透明控件允许点击

    我有一个问题 与以下内容有点相关 C Winforms 透明控件允许点击 https stackoverflow com questions 855826 c winforms transparent control allowing cl
  • 具有嵌套分组变量的多行轴标签

    我希望两个不同嵌套分组变量的级别显示在图下方的单独行上 而不是显示在图例中 我现在拥有的是这段代码 data lt read table text Group Category Value S1 A 73 S2 A 57 S1 B 7 S2
  • 如何创建像 $RANDOM 这样的 bash 变量

    我对某事感兴趣 每次我echo RANDOM 显示值差异 我猜 RANDOM 很特殊 当我读它时 它可能会调用一个函数 设置一个变量标志并返回 RANDOM 数字 我想创建一个这样的变量 我该怎么做 每个答案都会有帮助 的特殊行为 RAND
  • 如何在样条插值的所有数据点处放置导数零约束?

    scipy 中是否有任何用于样条插值的方法 我可以在每个数据点上对导数使用约束 我发现一个 scipy interpolate PiecewisePolynomial 但 PiecewisePolynomial 类已被弃用 Yes The
  • NgrxStore 和 Angular - 大量使用异步管道或在构造函数中仅订阅一次

    我开始查看 ngrx Store 并看到使用 Angular 异步管道的便利性 同时我不确定大量使用 Angular 异步管道是否是一个不错的选择 我举一个简单的例子 假设在同一个模板中 我需要显示从商店检索的对象 例如人员 的不同属性 一