2017-07-05 36 views
0

我正在與角4和5 RxJS工作,我有具有以下結構的對象(具有嵌套的受試者,在該示例僅2級):RxJs的getValue嵌套BehaviorSubject對象

objs = BehaviorSubject<MyObj[]>; 

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

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

所以,如果我嘗試輸出我有類似下面的OBJ文件的價值:

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

所以結果不包括PROP1和PROP2的值,但我仍然有BehaviorSubject在第二級。

有沒有辦法讓像嵌套OBJ文件值以下?:

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

我不知道是否有一種淘汰賽ko.toJSON(http://knockoutjs.com/documentation/plugins-mapping.html

你覺得嵌套BehaviorSubjects或人們每天都會這樣做通常是不好的做法:)?

回答

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一個很好的教程和閱讀。任何時候人們開始與行爲主題一起工作,我會推薦這一點。

+0

爲什麼會NGRX解決我的問題?我已經試過了NG終極版和NGRX但因爲我的狀態是太複雜/嵌套和寫入操作+減速機+複雜的負載太多的精力,我不使用它。 – user2010955

+0

同樣,我不明白你的真正的問題(例如,我不知道爲什麼你的狀態嵌套以這樣的方式),但NGRX是專爲處理複雜的狀態。所以,無論何時,當我看到有人試圖用可觀測量或主題做太多時,我認爲它值得一看。如果你看了,它不適用,那麼你可以忽略我的建議。如果您還沒有聽說過這些技術,那更有意。 – Pace