2012-04-07 4 views
0

So JSON Ich erhalte von dem Server, der so etwas wie folgt aussieht: Ich lese es in ein observableArray self.data mit dem Mapping-Plugin namensErstellen einer has_one Art Beziehung in knockout.js

{ 
    data: [ 
    { 
     foo: "hello", 
     bar_id: "92934848202" 
    }, 
    { 
     foo: "hello again", 
     bar_id: "39393020201" 
    }, 
    ] 
} 

wie :

self.data(ko.mapping.fromJS(json).data()); 

Ich habe ein anderes Modul namens bar, die alle Bars vom Server zusammen mit ihren IDs liest. Ich habe eine Methode in bar, die ein Objekt mit einer Methode namens find zurückgeben kann. So

bar.find("39393020201") // returns object 

Aber was würde ich wirklich tun möchte, ist das die self.data haben observableArray der Lage sein, direkt bar zugreifen, indem Sie etwas tun, wie:

self.data()[0].bar // ideally returns object? 

Der nächstgelegene ich waren Lage so weit zu bekommen, ist eine benutzerdefinierte Funktion wie folgt hinzuzufügen:

ko.observable.fn.bar = function() { 
    return bar.find(this()); 
}; 

Aber das verlangt, daß ich

nennen

was nicht sehr hübsch ist. Aber jede Funktion, die ich observableArray hinzufüge, wirkt auf das gesamte Array und nicht auf ein bestimmtes Objekt in diesem Array. Irgendwelche anderen Vorschläge?

Antwort

1

Sie müssen den Mapping-Prozess aufschlüsseln und manuell einen beobachtbaren "Balken" hinzufügen - das Mapping-Plugin erlaubt es, das bar_id (oder ein anderes) Observable durch ein berechnetes Observable zu ersetzen, das tut, was Sie wollen, aber Sie Sie können keine Eigenschaft erstellen, die in Ihrem Datenobjekt nicht vorhanden ist (z. B. "bar").

var tmp = []; 

for (var i = 0; i < json.data.length; i++) { 
    // Map only one object in the json.data array 
    var o = ko.mapping.fromJS(json.data[i]); 

    // Add a computed observable that turns bar_id into bar 
    o.bar = ko.computed(function() { 
     return self.bar.find(o.bar_id()); 
    }); 

    tmp.push(o); 
} 

self.data(tmp); 

http://jsfiddle.net/hTYy3/2/

+0

Dank Niko, ich war für eine saubere Art und Weise der Hoffnung .. vielleicht werde ich Knockout Gabel und sehen, ob ich etwas in aufbauen können. –