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数据的更多相关文章

  1. Knockout应用开发指南 第六章:加载或保存JSON数据

    原文:Knockout应用开发指南 第六章:加载或保存JSON数据 加载或保存JSON数据 Knockout可以实现很复杂的客户端交互,但是几乎所有的web应用程序都要和服务器端交换数据(至少为了本地 ...

  2. 第六章:加载或保存JSON数据

    加载或保存JSON数据 Knockout可以实现很复杂的客户端交互,但是几乎所有的web应用程序都要和服务器端交换数据(至少为了本地存储需要序列化数据),交换数据最方便的就是使用JSON格式 – 大多 ...

  3. KnockoutJS 3.X API 第七章 其他技术(4) 速率限制

    注意:这个速率限制API是在Knockout 3.1.0中添加的. 通常,更改的observable立即通知其订户,以便依赖于observable的任何计算的observable或绑定都会同步更新. ...

  4. KnockoutJS 3.X API 第七章 其他技术(8) 异步错误处理

    注意:本文档适用于Knockout 3.4.0及更高版本. ko.onError Knockout包装内部异步调用,并在抛出原始错误之前查找可选的ko.onError回调以执行(如果遇到异常). 这使 ...

  5. KnockoutJS 3.X API 第七章 其他技术(7) 微任务

    注意:本文档适用于Knockout 3.4.0及更高版本. Knockout的微任务队列 Knockout的微任务队列支持调度任务尽可能快地运行,同时仍然是异步的,努力安排它们在发生I / O,回流或 ...

  6. KnockoutJS 3.X API 第七章 其他技术(6) 使用“fn”添加自定义函数

    有时,您可能会通过向Knockout的核心值类型添加新功能来寻找机会来简化您的代码. 您可以在以下任何类型中定义自定义函数: 因为继承,如果你附加一个函数到ko.subscribable,它将可用于所 ...

  7. KnockoutJS 3.X API 第七章 其他技术(5) 使用其他事件处理程序

    在大多数情况下,数据绑定属性提供了一种干净和简洁的方式来绑定到视图模型. 然而,事件处理是一个常常会导致详细数据绑定属性的领域,因为匿名函数通常是传递参数的推荐技术. 例如: <a href=& ...

  8. KnockoutJS 3.X API 第七章 其他技术(3) 延迟更新

    .example { display: inline-block; padding: 1em; margin-right: 2em; background: #F6F6EF; } 注意:本文档适用于K ...

  9. KnockoutJS 3.X API 第七章 其他技术(2) 使用扩展器来增加可观察量(监控属性)

    Knockout observables提供了支持读取/写入值并在值改变时通知订阅者所需的基本功能. 但在某些情况下,您可能希望向可观察者添加其他功能. 这可能包括通过在可观察者前面放置一个可写的计算 ...

随机推荐

  1. 16-01-25---Servlet复习笔记(01)

    Servlet ServletAPI中有4个java包    javax.servlet 包含Servlet与Servlet容器之间契约的类和接口    javax.servlet.http 包含HT ...

  2. [杂谈]冲NOIP一等奖。。

    唉不想多说了. 真是一段“传奇”的经历啊. 还是那句话..“是的我上次什么都没说就走了...”这次也一样. 我还是太单纯的以为我们是肯定能够参加北大的夏令营的..然而结果真是意料之外啊. 本来我以为我 ...

  3. bzoj1008快速面

    快速面裸题(显然的m^n-m*(m-1)^(n-1)) 然后,,,就没有然后了 #include <cstdio> #define wzf2000 100003 long long n,m ...

  4. 【BZOJ】4144: [AMPPZ2014]Petrol

    题意 给定一个\(n\)个点.\(m\)条边的带权无向图,其中有\(s\)个点是加油站.每辆车都有一个油量上限\(b\),即每次行走距离不能超过\(b\),但在加油站可以补满.\(q\)次询问,每次给 ...

  5. svn比对

    svn版本管理, 先要把你项目添加到svn版本管理中,添加完之后,文件夹就有一个绿色的勾,已经被svn进程管理了. 文件夹里面,每一层级,都有一个.svn文件夹,这个很重要,就是靠这个存放原有的文件, ...

  6. jQueryUI Draggable 和 Droppable 配合使用时遇到的两个坑

    jQueryUI 的 拖拽插件极大的方便了开发者对拖拽功能的实现,但是官方教程给的太笼统,在具体实现的时候很多地方不明确,这里说一下我遇到的两个 "小坑": 1:Draggable ...

  7. poj3250

    //(栈)poj3250将第i头牛能看到多少牛传化为第i头牛能被多少牛看见 /* #include <stdio.h> #include <stack> using names ...

  8. sublime Text 3 字体

    1,Comic Sans Ms 2,DejaVu Sans Mono 3,microsoft yahei(微软雅黑) 4,Microsoft Yahei UI(微软雅黑增强版) 5,Ubuntu Mo ...

  9. Reversing Linked List

    原题连接:https://www.patest.cn/contests/pat-a-practise/1074 题目: Given a constant K and a singly linked l ...

  10. iOS开发之AFNetworking 3.0.4使用

    昨天使用Cocoapods导入AFN做POST的时候,导入的最新版的3.0.4,突然发现找不到AFHTTPRequestOperationManager了...上github上一看,发现没有这个了.刚 ...