2013-11-10 8 views
5

Próbuję zapisać obserwowalną tablicę za pomocą metody ko.toJSON do localStorage. Podczas ładowania pierwszej strony moja aplikacja otrzyma obiekt JSON z serwera i zapełni obiekt obserwowalny. Chciałbym przechowywać go w localStorage w celu optymalizacji i użycia w trybie offline, ale ko.toJSON powraca [], chociaż są tam wyraźnie dane.Zapisz nokaut obserwowalneArray JSON na localStorage

jestem w stanie odtworzyć ten problem w tym jsFiddle

HTML

<span data-bind="text: locations().length"></span> 
<div data-bind="foreach: locations"> 
    <div> 
     <span data-bind="text: title"></span> 
     <span> </span> 
     <span data-bind="text: timeZone"></span> 
    </div> 
</div> 
<pre data-bind="text: output"></pre> 

JavaScript

var dataFromServer = [ 
    {name: "Cleveland", zone: "EST"}, 
    {name: "Chicago", zone: "CST"}, 
    {name: "New York", zone: "EST"} 
]; 

var MyNS = window.MyNS || {}; 
MyNS.ViewModel = function() { 
    var self = this; 
    self.locations = ko.observableArray([]); 
    self.load = function(){ 
     var mappedData = ko.utils.arrayMap(dataFromServer, function(item) { 
      return new MyNS.Location(item.name, item.zone); 
     }); 
     self.locations(mappedData); 
    }; 
    self.output = ko.toJSON(self.locations()); 
    self.execute = function(){ 
     self.load(); 
     ko.applyBindings(self); 
    }; 
}; 
MyNS.Location = function (t, z) { 
    this.title = t; 
    this.timeZone = z; 
}; 
var model = new MyNS.ViewModel(); 
model.execute(); 

Odpowiedz

4

Problemem jest to, że zmienna output ma swoją wartość tylko napisane raz, na pierwszym biegu oszustwa structor, gdy tablica lokalizacji jest pusta. Aby zaktualizować wyjście na zmiany lokalizacji, można przekształcić go w obliczana zaobserwować, jak to:

self.output = ko.computed(function(){ 
    return ko.toJSON(self.locations()) 
}); 

Zaktualizowany skrzypce: http://jsfiddle.net/wvgRL/4/

+0

Działa idealnie, dzięki! –

Powiązane problemy