【问题标题】:How to set Behaviour Subject initial value retrieved from Database?如何设置从数据库中检索到的行为主体初始值?
【发布时间】:2019-12-10 13:48:03
【问题描述】:

我通过BehaviorSubject 将数据从父组件传递到其子组件,方法如下(为简洁起见,我简化了该方法):

const subject = new BehaviorSubject(undefined);

// subscriber A
subject.subscribe((data) => {
    if(data !== undefined)
        ReloadData(data);
    else
         FirstLoadData();
});

subject.next(myDataObtainedFromDatabase);

在父组件中,我将获取的数据传递给订阅主题的所有组件。另一方面,我检查数据参数以检测它是否是第一次加载。在第一次加载时,我从数据库中检索数据,然后将数据传递给组件。

我的问题是,

1)通过使用BehaviorSubject(我不想只使用Subject),有没有更好的方法在第一次加载时在这里加载子组件?

2) 对于从父级向子级传递数据,使用BehaviorSubject 而不是Input() 属性是否更好,即使后者似乎更容易应用?

【问题讨论】:

  • 事件发射器用于从子传递到父,输入属性从父传递到子。
  • @AdrianBrand 对不起,你说得对。我的意思是Input() property :) 我更新了我的问题。
  • @c69 谢谢。在该页面中,建议使用ReplaySubject(1) 而不是使用BehaviorSubject(null)。但我认为BehaviorSubject 有更多优势,为此我想使用它。那么,我应该通过初始值检查来使用它吗?有什么想法吗?

标签: angular typescript rxjs eventemitter behaviorsubject


【解决方案1】:

您使用输入属性将对象从父级传递给子级。在您的父母身上,您从服务中获取数据并将其放在可观察的属性中,例如

data$ = this.dataService.getData();

并在视图中使用异步管道传递数据。

<child-component [data]="data$ | async"></child-component>

并且在子组件中有一个数据输入

@Input()
data: DataType;

现在,当服务在 data$ observable 上调用 next 时,它会神奇地传递给子组件。

无需订阅和管理订阅。

【讨论】:

  • 感谢您的精彩解释。实际上我的意思是Input() 属性而不是EventEmitter 并考虑使用Input() 属性。所以,在这种情况下:1) 正如你所说,真的没有必要让事情变得复杂。通过查看我的场景,我有一个父仪表板组件和 4 个子组件。我在第一次加载到父母时得到统计数据。当我使用另一个组件添加新记录时,我将新统计信息传递给父级。通过使用上述方法,我可以更新所有孩子并实现我的目标,这一切都是真的吗?
  • 2) 一开始加载没问题,但后来我也会从paren更新孩子,但使用SignalR更新父母。在这种情况下,将孩子作为第一个场景进行更新是否意味着任何意义?让我困惑的想法是关于这个问题。有什么想法吗?
  • 阅读我关于我编写的名为 RxCache 的库的文章,它可能会对您有所帮助。 medium.com/@adrianbrand/…
  • 非常感谢,但我们尽可能避免使用额外的库(我想在我的个人项目中使用它)。那么,在这个场景中,您如何看待我上面的两个问题?问候...
猜你喜欢
  • 1970-01-01
  • 2022-01-04
  • 1970-01-01
  • 1970-01-01
  • 2022-11-04
  • 2018-12-06
  • 2021-11-22
  • 2021-06-26
  • 1970-01-01
相关资源
最近更新 更多