2017-07-05 27 views
0

Ich bin mit Winkel 4 und RxJS Arbeits 5, ich habe ein Objekt mit der folgenden Struktur (mit verschachtelten Themen, die in diesem Beispiel nur 2 Ebene):RxJs getValue für verschachteltes BehaviorSubject Objekt

objs = BehaviorSubject<MyObj[]>; 

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

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

Also, wenn ich versuche, den Wert von objs ausgeben ich so etwas wie die folgende bekommen:

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

so das Ergebnis nicht enthalten sind die Werte von PROP1 und prop2 aber ich habe noch BehaviorSubject auf der zweiten Ebene.

Gibt es eine Möglichkeit, die verschachtelte objs Wert wie die erhalten folgende ?:

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

Ich frage mich, ob eine Art der Knockout gibt es ko.toJSON (http://knockoutjs.com/documentation/plugins-mapping.html)

Sie denken, Sie Es ist generell eine schlechte Übung, Verhaltens-Subjekte verschachtelt zu haben oder Leute machen es jeden Tag :)?

Antwort

0

Nein, da ist nichts eingebaut das das macht. Sie könnten sicherlich Ihre eigene Methode rollen. Dies könnte etwas sein, mit denen Sie beginnen können:

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; 
} 

Nested Verhalten Themen scheinen faul zu mir, aber ich würde es nicht sofort ausschließen mit Mehr Details zu kennen. Ich würde jedoch empfehlen, Sie finden ein gutes Tutorial auf ngrx/store und lesen Sie es. Wenn Menschen anfangen, viel mit Verhaltensthemen zu arbeiten, würde ich dies empfehlen.

+0

Warum ngrx würde mein Problem lösen? Ich habe ng Redux und ngrx probiert, aber ich benutze es nicht, da mein Zustand zu komplex/verschachtelt ist und der Aufwand, die Aktionen + Reduzierungen + komplexe Nutzlast zu schreiben, zu viel ist. – user2010955

+0

Noch einmal, ich verstehe Ihr wahres Problem nicht (z. B. ich weiß nicht, warum Ihr Zustand auf solche Weise verschachtelt ist), aber ngrx wurde für die Behandlung komplexer Zustände entwickelt. Also wenn ich jemanden sehe, der versucht, zu viel mit Observablen oder Themen zu tun, denke ich, dass es einen Blick wert ist. Wenn du geschaut hast und es nicht zutrifft, kannst du meinen Ratschlag ignorieren. Es war eher beabsichtigt, falls Sie nicht von diesen Technologien gehört hatten. – Pace

Verwandte Themen