ich habe eine kleine jquery mobile/cordova app, die Einstellungen in den LocalStorage schreibt. Genauer gesagt handelt es sich dabei um ein JSON-serialisierte Knockout-Viewmodel.
Das Speichern klappt wunderbar und auch das Laden als JSON. Wenn ich die Daten allerdings beim Laden der Anwendung in die observables von knockout stopfen will, bekomme ich die folgende Meldung: "Unable to get value of the property 'benutzer': object is null or undefined" Scheinbar ist also die Observable-Property von Knockout noch nicht initialisiert oder ähnliches. ko.ApplyBindings() wurde aber vorher aufgerufen. Und es funktioniert auch nicht, wenn ich die Lade-Funktion "nach später" auslagere, also etwa erst dann aufrufe, wenn ich in eine zweite jquery mobile page wechsle.
Hat jemand eine Idee, woran ich hier scheitere?
Das setzen der observable sieht übrigens so aus: viewModels.benuterDatenVM.benutzer(parsedData.benutzer); viewModels und benutzerDatenVM existieren als Objekte. parsedData.benutzer ist auch korrekt befüllt.
Ich vermute mal, dass Du Dein View-Model "as is" als JSON abgespeichert hast. Die observable/computed properties eines Knockout-View-Models sind aus Javascript-Sicht aber keine Properties, sondern Funktionen - und die werden nicht nach JSON serialisiert und stehen folglich nach dem Deserialisieren auch nicht zur Verfügung.
Die Lösung ist, nicht das View-Model selbst abzuspeichern, sondern seinen Zustand, und diesen dann beim Laden wieder herzustellen. Und glücklicherweise sieht es in der Doku von KnockoutJS so aus, als gäbe es dafür sogar eingebaute Helferlein.
Danke für deine Antwort! Aber ich kann die Daten ja korrekt serialisieren. Ich habe sie im Localstorage abgelegt und nach dem Laden bekomme ich ein ordentliches JSON-Objekt, dass ich in ein JS-Objekt parsen kann. Lediglich das Zuweisen zu den Observables NACH dem Laden und Parsen funktioniert nicht.
Aber ich habe nun eh beschlossen, von der Javascript/HTML5-Schiene wieder weg zu gehen. Ich kann mich damit einfach nicht anfreunden und werde eher Cross-Platform mit Mono/Xamarin entwickeln. Trend hin oder her, aber JS liegt mir einfach nicht. ;)