敲除 viewModel:将其保存在 localStorage 上并检索它
knockout viewModel: save it on localStrorage and retrive it
我使用 knockout 根据从 Web 服务获取的一些数据在页面中执行各种操作。用户之后可以 select 某些事情并通过一些 select 输入操作数据,这会影响 knockout 的 viewModel。
当用户完成更改后,它将继续到下一个表单(带有 POST),这是另一个网页。
我想做的是在离开页面之前将当前 viewModel 存储在 localStorage 中,如果 he/she 按下返回,则从 localStorage 加载 viewModel。
所以在用户离开页面之前,在我的 viewModel 中我会这样做:
localStorage.setItem("vM", JSON.stringify(self));
然后在我的第一页我有:
var viewModel; viewModel = JSON.parse(localStorage.getItem("vM"));
if(viewModel == undefined || viewModel == null) viewModel = new vM();
ko.applyBindings(viewModel);
但是从json解析后viewModel并不是一个有效的knockout模型。有办法吗?
谢谢
当一个 knockout viewModel 被字符串化时,由于 observables 的缘故,它不能干净地序列化,所以它不能被直接反序列化回一个有效的 viewModel。
最好的方法是使用 ko.json
函数将您的视图模型转换为具有所有当前值的普通对象版本。将其保存在 localStorage 中。
然后您必须正常初始化您的 viewModel,并在创建 observable 时插入从 localStorage 检索到的对象的值。
可以在文档中找到更多详细信息:
http://knockoutjs.com/documentation/json-data.html
尝试使用 knockout.mapping 插件。
在保存到 localStorage
调用之前:
var unmapped = ko.mapping.toJS(viewModel);
要使用来自 localStorage
的数据更新模型,请使用
ko.mapping.fromJS(data, viewModel);
我使用 knockout 根据从 Web 服务获取的一些数据在页面中执行各种操作。用户之后可以 select 某些事情并通过一些 select 输入操作数据,这会影响 knockout 的 viewModel。
当用户完成更改后,它将继续到下一个表单(带有 POST),这是另一个网页。
我想做的是在离开页面之前将当前 viewModel 存储在 localStorage 中,如果 he/she 按下返回,则从 localStorage 加载 viewModel。
所以在用户离开页面之前,在我的 viewModel 中我会这样做:
localStorage.setItem("vM", JSON.stringify(self));
然后在我的第一页我有:
var viewModel; viewModel = JSON.parse(localStorage.getItem("vM"));
if(viewModel == undefined || viewModel == null) viewModel = new vM();
ko.applyBindings(viewModel);
但是从json解析后viewModel并不是一个有效的knockout模型。有办法吗?
谢谢
当一个 knockout viewModel 被字符串化时,由于 observables 的缘故,它不能干净地序列化,所以它不能被直接反序列化回一个有效的 viewModel。
最好的方法是使用 ko.json
函数将您的视图模型转换为具有所有当前值的普通对象版本。将其保存在 localStorage 中。
然后您必须正常初始化您的 viewModel,并在创建 observable 时插入从 localStorage 检索到的对象的值。
可以在文档中找到更多详细信息: http://knockoutjs.com/documentation/json-data.html
尝试使用 knockout.mapping 插件。
在保存到 localStorage
调用之前:
var unmapped = ko.mapping.toJS(viewModel);
要使用来自 localStorage
的数据更新模型,请使用
ko.mapping.fromJS(data, viewModel);