KnockoutJS 3.X API 第七章 其他技术(1) 加载和保存JSON数据
Knockout允许您实现复杂的客户端交互性,但几乎所有Web应用程序还需要与服务器交换数据,或至少将本地存储的数据序列化。 最方便的交换或存储数据的方式是JSON格式 - 大多数Ajax应用程序今天使用的格式。
加载或保存数据
Knockout不强制您使用任何一种特殊技术来加载或保存数据。 您可以使用任何适合您所选择的服务器端技术的机制。 最常用的机制是jQuery的Ajax方法,例如getJSON,post和ajax。 您可以从服务器获取数据:
$.getJSON("/some/url", function(data) {
// Now use this data to update your view models,
// and Knockout will update your UI automatically
})
或者您可以向服务器发送数据:
var data = /* Your data in JSON format - see below */;
$.post("/some/url", data, function(returnedData) {
// This callback is executed if the post was successful
})
或者,如果您不想使用jQuery,则可以使用任何其他机制来加载或保存JSON数据。 所以,所有Knockout需要帮助你做的是:
- 要保存,请将您的视图模型数据转换为简单的JSON格式,以便可以使用上述其中一种技术发送它
- 要加载,请使用您通过上述其中一种方法收到的数据更新视图模型
将视图模型数据转换为纯JSON
您的视图模型是JavaScript对象,因此在某种意义上,您可以使用任何标准JSON序列化程序(例如JSON.stringify(现代浏览器中的本地函数)或json2.js library)将它们序列化为JSON。 但是,您的视图模型可能包含observables,computed observables和observable数组,这些数组实现为JavaScript函数,因此不会在不执行额外工作的情况下完全序列化。
为了便于序列化视图模型数据,包括observables等,Knockout包括两个帮助函数:
ko.toJS— 这克隆了你的视图模型的对象图,用每个observable替换了observable的当前值,所以你得到一个只包含你的数据和没有Knockout相关的工件ko.toJSON— 这将生成一个JSON字符串,表示您的视图模型的数据。 在内部,它简单地在您的视图模型上调用ko.toJS,然后在结果上使用浏览器的原生JSON序列化程序。 注意:为了在没有本地JSON序列化器(例如,IE 7或更早版本)的旧版浏览器上工作,还必须引用json2.js库。
例如,定义视图模型如下:
var viewModel = {
firstName : ko.observable("Bert"),
lastName : ko.observable("Smith"),
pets : ko.observableArray(["Cat", "Dog", "Fish"]),
type : "Customer"
};
viewModel.hasALotOfPets = ko.computed(function() {
return this.pets().length > 2
}, viewModel)
它包含可观察量,计算可观察量,可观察数组和平均值的混合。 您可以将其转换为适用于使用ko.toJSON发送到服务器的JSON字符串,如下所示:
ar jsonData = ko.toJSON(viewModel); // Result: jsonData is now a string equal to the following value
// '{"firstName":"Bert","lastName":"Smith","pets":["Cat","Dog","Fish"],"type":"Customer","hasALotOfPets":true}'
或者,如果您只想在序列化之前使用纯JavaScript对象图,请使用ko.toJS如下:
var plainJs = ko.toJS(viewModel); // Result: plainJS is now a plain JavaScript object in which nothing is observable. It's just data.
// The object is equivalent to the following:
// {
// firstName: "Bert",
// lastName: "Smith",
// pets: ["Cat","Dog","Fish"],
// type: "Customer",
// hasALotOfPets: true
// }
注意,ko.toJSON接受与JSON.stringify相同的参数。 例如,在调试Knockout应用程序时,对视图模型数据进行“实时”表示是非常有用的。 要为此目的生成格式良好的显示,可以将空格参数传递给ko.toJSON并绑定到视图模型,如:
<pre data-bind="text: ko.toJSON($root, null, 2)"></pre>
使用JSON更新视图模型数据
如果您从服务器加载了一些数据,并希望使用它来更新您的视图模型,最直接的方法是:
// Load and parse the JSON
var someJSON = /* Omitted: fetch it from the server however you want */;
var parsed = JSON.parse(someJSON); // Update view model properties
viewModel.firstName(parsed.firstName);
viewModel.pets(parsed.pets);
在许多情况下,这种直接方法是最简单和最灵活的解决方案。 当然,当您更新视图模型上的属性时,Knockout将会更新可见的UI来匹配它。
然而,许多开发人员更喜欢使用更多的基于约定的方法来使用传入数据更新他们的视图模型,而不需要为每个要更新的属性手动编写一行代码。 如果您的视图模型具有许多属性或深层嵌套的数据结构,这可能是有益的,因为它可以大大减少您需要编写的手动映射代码的数量。 有关此技术的更多详细信息,请参阅以后章节的knockout.mapping插件。
KnockoutJS 3.X API 第七章 其他技术(1) 加载和保存JSON数据的更多相关文章
- Knockout应用开发指南 第六章:加载或保存JSON数据
原文:Knockout应用开发指南 第六章:加载或保存JSON数据 加载或保存JSON数据 Knockout可以实现很复杂的客户端交互,但是几乎所有的web应用程序都要和服务器端交换数据(至少为了本地 ...
- 第六章:加载或保存JSON数据
加载或保存JSON数据 Knockout可以实现很复杂的客户端交互,但是几乎所有的web应用程序都要和服务器端交换数据(至少为了本地存储需要序列化数据),交换数据最方便的就是使用JSON格式 – 大多 ...
- KnockoutJS 3.X API 第七章 其他技术(4) 速率限制
注意:这个速率限制API是在Knockout 3.1.0中添加的. 通常,更改的observable立即通知其订户,以便依赖于observable的任何计算的observable或绑定都会同步更新. ...
- KnockoutJS 3.X API 第七章 其他技术(8) 异步错误处理
注意:本文档适用于Knockout 3.4.0及更高版本. ko.onError Knockout包装内部异步调用,并在抛出原始错误之前查找可选的ko.onError回调以执行(如果遇到异常). 这使 ...
- KnockoutJS 3.X API 第七章 其他技术(7) 微任务
注意:本文档适用于Knockout 3.4.0及更高版本. Knockout的微任务队列 Knockout的微任务队列支持调度任务尽可能快地运行,同时仍然是异步的,努力安排它们在发生I / O,回流或 ...
- KnockoutJS 3.X API 第七章 其他技术(6) 使用“fn”添加自定义函数
有时,您可能会通过向Knockout的核心值类型添加新功能来寻找机会来简化您的代码. 您可以在以下任何类型中定义自定义函数: 因为继承,如果你附加一个函数到ko.subscribable,它将可用于所 ...
- KnockoutJS 3.X API 第七章 其他技术(5) 使用其他事件处理程序
在大多数情况下,数据绑定属性提供了一种干净和简洁的方式来绑定到视图模型. 然而,事件处理是一个常常会导致详细数据绑定属性的领域,因为匿名函数通常是传递参数的推荐技术. 例如: <a href=& ...
- KnockoutJS 3.X API 第七章 其他技术(3) 延迟更新
.example { display: inline-block; padding: 1em; margin-right: 2em; background: #F6F6EF; } 注意:本文档适用于K ...
- KnockoutJS 3.X API 第七章 其他技术(2) 使用扩展器来增加可观察量(监控属性)
Knockout observables提供了支持读取/写入值并在值改变时通知订阅者所需的基本功能. 但在某些情况下,您可能希望向可观察者添加其他功能. 这可能包括通过在可观察者前面放置一个可写的计算 ...
随机推荐
- Poj The xor-longest Path 经典题 Trie求n个数中任意两个异或最大值
Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 5646 Accepted: 1226 Description In an ...
- Python爬虫学习(9):Selenium的使用
1 简介以及安装 Selenium 是什么?一句话,自动化测试工具.它支持各种浏览器,包括 Chrome,Safari,Firefox 等主流界面式浏览器,如果你在这些浏览器里面安装一个 Seleni ...
- Linux 利用lsof命令恢复删除的文件
lsof命令 lsof命令用于查看你进程开打的文件,打开文件的进程,进程打开的端口(TCP.UDP).找回/恢复删除的文件.是十分方便的系统监视工具,因为lsof命令需要访问核心内存和各种文件,所以需 ...
- java-并发-活性
浏览以下内容前,请点击并阅读 声明 一个并发程序以适时方式执行的能力叫活性.以下部分介绍最常见的一种活性问题,死锁,并简单介绍其他两种活性问题,饥饿和活锁. 死锁 死锁描述了一种情况:两个或两个以上的 ...
- jQuery.lazyload
Lazy Load延迟加载也有的称为惰性加载,是一个用 JavaScript 编写的 jQuery 插件. 它可以延迟加载长页面中的图片. 在浏览器可视区域外的图片不会被载入, 直到用户将页面滚动到它 ...
- 51nod 1712 区间求和
题意 给你一个长度为 \(n\) 的序列,定义这个序列的权值为 $ \sum_{1 \leq i<j \leq n} a_j - a_i $. 现在给你一个长度为 \(n\) 的序列,当$ a_ ...
- 【java基础学习】-【泛型】
参考以下几位同学的总结来学习: http://www.cnblogs.com/lwbqqyumidi/p/3837629.html#!comments http://www.weixueyuan.ne ...
- bzoj2002弹(dan)飞绵羊 分块水过
据说是道lct求深度的题 但是在小猫大的指点下用分块就n^1.5水过了 = =数据忘记加强系列 代码极其不美观,原因是一开始是听小猫大讲的题意,还以为是弹到最前面... #include <cs ...
- winform控件在Enable=false的情况下改变它的字体颜色
[System.Runtime.InteropServices.DllImport("user32.dll ")] public static extern int ...
- java项目启动后,数据库字段生成 user_name带下划线这种形式的
hibernate 5.0 版本以上去掉了 hibernate.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy 这个属性,如果非 ...