【问题标题】:RxJs getValue for nested BehaviorSubject object嵌套 BehaviorSubject 对象的 RxJs getValue
【发布时间】:2017-07-05 12:01:45
【问题描述】:

我正在使用 angular 4 和 RxJS 5,我有一个具有以下结构的对象(具有嵌套主题,在此示例中只有 2 个级别):

objs = BehaviorSubject<MyObj[]>;

MyObj = {
    prop1: BehaviorSubject<string> = "prop1";
    prop2: BehaviorSubject<string> = "prop2";

    prop1.subscribe(newValue => prop2 = prop1);
}

因此,如果我尝试输出 objs 的值,我会得到如下结果:

console.log(objs.value) =>
    [
    {
        prop1: BehaviorSubject<string>;
        prop2: BehaviorSubject<string>;
        },
    {
        ...
    }]

所以结果不包括 prop1 和 prop2 的值,但我仍然有第二级的 BehaviorSubject。

有没有办法像下面这样获取嵌套的 objs 值?:

objs = [{
    prop1: "prop1";
    prop2: "prop2"
 }, {...}]

我想知道是否有某种淘汰赛 ko.toJSON (http://knockoutjs.com/documentation/plugins-mapping.html)

您认为嵌套 BehaviorSubject 或人们每天都这样做通常是一种不好的做法吗:)?

【问题讨论】:

    标签: nested rxjs behaviorsubject


    【解决方案1】:

    不,没有任何内置功能可以做到这一点。你当然可以推出自己的方法。这可能是你可以开始的东西:

    function isPrimitive(obj: any) {
      return obj !== Object(obj);
    }
    
    function desubjectify(obj: any) {
    
      if(isPrimitive(obj)) {
        return obj;
      }
    
      if(obj instanceof BehaviorSubject) {
        return desubjectify(obj.value);
      }
    
      let transformed: any = {};
      for(let key of Object.keys(obj).filter(key => !key.startsWith('_'))) {
        let value = obj[key];
        if(value instanceof BehaviorSubject) {
          transformed[key] = desubjectify(value.value);
        } else {
          transformed[key] = desubjectify(value);
        }
      }
      return transformed;
    }
    

    嵌套行为主题对我来说似乎很可疑,但我不会在不了解更多细节的情况下立即排除它。但是,我建议您在 ngrx/store 上找到一个很好的教程并阅读它。每当人们开始大量处理行为主题时,我都会推荐这个。

    【讨论】:

    • 为什么ngrx会解决我的问题?我已经尝试过 ng Redux 和 ngrx,但我没有使用它,因为我的状态太复杂/嵌套,并且编写动作 + 减速器 + 复杂有效负载的工作量太大。
    • 再一次,我不明白你真正的问题(例如,我不知道为什么你的状态以这种方式嵌套)但 ngrx 是为处理复杂状态而设计的。因此,每当我看到有人试图对可观察对象或主题做太多事情时,我认为值得一看。如果你看过但它不适用,那么你可以忽略我的建议。如果您没有听说过这些技术,它更适合您。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-25
    • 2020-08-28
    • 1970-01-01
    • 1970-01-01
    • 2020-01-24
    • 2017-05-04
    • 2021-04-19
    相关资源
    最近更新 更多