35 Stimmen

Knockout.js Jedes verschachtelte Objekt zu einem Observable machen

Ich verwende Knockout.js als MVVM-Bibliothek, um meine Daten an einige Seiten zu binden. Ich baue derzeit eine Bibliothek, um REST-Aufrufe an einen Webdienst zu machen. Mein RESTful-Webdienst gibt eine einfache Struktur zurück:

{
    id : 1,
    details: {
        name: "Johnny",
        surname: "Boy"
    }
}

Ich habe ein beobachtbares Haupt-Elternteil, myObject . Wenn ich das tue

myObject(ko.mapping.fromJS(data))

die Observablen in myObject sind:

  • id
  • name
  • surname

Wie kann ich die details (und theoretisch jedes Objekt in der Struktur ein Observable)? Ich brauche dieses Verhalten, so dass ich eine berechnete observable auf Details setzen kann und bemerkt werden, sobald einer der internen Daten ändert.

Ich habe eine einfache rekursive Funktion eingerichtet, die das Problem lösen sollte. Das tut sie natürlich nicht, myObject.details wird nicht zu einer Beobachtungsgröße.

// Makes every object in the tree an observable.
var makeAllObservables = function () {
    makeChildrenObservables(myObject);
};
var makeChildrenObservables = function (object) {
    // Make the parent an observable if it's not already
    if (!ko.isObservable(object)) {
        if ($.isArray(object))
            object = ko.observableArray(object);
        else
            object = ko.observable(object);
    }
    // Loop through its children
    for (var child in object()) {
        makeChildrenObservables(object()[child]);
    }
};

Ich bin mir ziemlich sicher, dass es etwas mit falschen Referenzen zu tun hat, aber wie kann ich das Problem lösen? Ich danke Ihnen.

1voto

Beans Punkte 1010

Vielleicht könnte es in einer zukünftigen Version eine Konfigurationsoption geben, die ko.mapping.fromJS veranlasst, immer Observables zu erstellen. Dies könnte für neue Projekte oder nach der Aktualisierung der Bindungen eines bestehenden Projekts aktiviert werden.

Um dieses Problem zu vermeiden, stelle ich sicher, dass die Objekteigenschaften der Modellseeds auf jeder Ebene ausgefüllt sind. Auf diese Weise werden alle Objekteigenschaften als POJOs (Plain Old Javascript Objects) abgebildet, so dass das ViewModel sie nicht als ko.observables initialisiert. Es vermeidet das "manchmal Observables, manchmal nicht" Problem.

Mit freundlichen Grüßen, Mike

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X