0

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

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

4

1 回答 1

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并阅读它。每当人们开始大量研究行为主题时,我都会推荐这个。

于 2017-07-05T17:04:50.760 回答