RxJs getValue用于嵌套的BehaviorSubject对象

时间:2017-07-05 12:01:46

标签: nested rxjs behaviorsubject

我正在使用角度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

您是否认为拥有嵌套的BehaviorSubjects或人们每天都这样做是不好的做法:)?

1 个答案:

答案 0 :(得分:0)

不,没有内置的功能。你当然可以推出自己的方法。这可能是你可以开始的:

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上找到一个很好的教程并阅读它。任何时候人们开始大量使用行为主题,我会推荐这个。