2015-04-02 49 views
0

根據從Web服務獲取的某些數據,我使用淘汰賽在頁面中執行各種操作。用戶可以事後選擇某些事物並通過一些選擇輸入來操作數據,這些輸入會影響淘汰賽的視圖模型。淘汰賽viewModel:將其保存在localStrorage並將其回收

當用戶完成更改後,它將繼續下一個表單(帶POST),這是另一個網頁。

我想要做的是在localStorage離開頁面之前存儲當前的viewModel,如果他/她按下,從localStorage加載viewModel。

在用戶之前,我的ViewModel

所以離開頁面我做的:

localStorage.setItem("vM", JSON.stringify(self)); 

然後在我的FRST的網頁我有:

var viewModel; viewModel = JSON.parse(localStorage.getItem("vM")); 

if(viewModel == undefined || viewModel == null) viewModel = new vM(); 

ko.applyBindings(viewModel); 

但視圖模型是不是從JSON進行解析後,一個有效的淘汰賽模式。有沒有辦法做到這一點?

感謝

+0

你要麼必須創建它知道如何從建立一個自定義構造您的視圖模型JSON或者如果你的視圖模型很簡單,你可以使用[mapping plugin](http://knockoutjs.com/documentation/plugins-mapping.html)。 – nemesv 2015-04-02 07:55:51

回答

1

當淘汰賽視圖模型被字符串化不乾淨連載由於觀測,所以它不能被直接回到了一個有效的視圖模型deserialised。

最好的方法是使用ko.json函數將視圖模型轉換爲包含所有當前值的普通對象版本。將其保存在localStorage中。

然後你將不得不像平常一樣初始化你的viewModel,並在創建observables時從你的localStorage檢索到的對象中插入值。

更多細節可以在文檔中找到: http://knockoutjs.com/documentation/json-data.html

+0

我試過了。但是我再也無法將綁定應用於此緩存模型。我相信是因爲它具有可觀察的權利?那麼有沒有一種方法來保存/檢索一個全功能的淘汰賽viewModel? – gong 2015-04-02 08:29:44

+0

我不這麼認爲。您必須將緩存對象中的值轉換爲viewModel的observables,然後像平常一樣綁定它。緩存的對象不會重新創建可觀察結構。 – Starscream1984 2015-04-02 12:45:23

1

嘗試使用knockout.mapping插件。

Beore保存到localStorage電話:

var unmapped = ko.mapping.toJS(viewModel); 

要更新模型與數據從localStorage使用

ko.mapping.fromJS(data, viewModel); 
+0

如果您有嵌套的觀察對象(可觀察數組中的觀察對象),這將不起作用。 – Silencer 2016-10-26 13:57:52