2015-04-02 53 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