创建数据驱动的用户界面是 web 开发人员最复杂的工作之一。它需要对接口及其底层数据进行仔细的管理。例如,考虑一个电子商务网站的简单购物车界面。当用户从购物车中删除一个项目时,您必须从基础数据集中删除该项目,从购物车的 HTML 页面中删除关联的元素,并更新总价。除了最琐碎的应用程序之外,找出哪些 HTML 元素依赖于特定的数据是一项容易出错的工作。
...
...
@@ -6,29 +6,29 @@
图 1:手动跟踪 HTML 元素及其底层数据之间的依赖关系
[淘汰赛. js](http://knockoutjs.com/) JavaScript 库提供了一种更干净的方式来管理这些复杂的数据驱动接口。不是手动跟踪 HTML 页面的哪些部分依赖于受影响的数据,而是让您在底层数据及其表示之间创建直接连接。将一个 HTML 元素与一个特定的数据对象链接后,对该对象的任何更改都将自动*反映在 DOM 中。*
[knockout. js](http://knockoutjs.com/) JavaScript 库提供了一种更干净的方式来管理这些复杂的数据驱动接口。不是手动跟踪 HTML 页面的哪些部分依赖于受影响的数据,而是让您在底层数据及其表示之间创建直接连接。将一个 HTML 元素与一个特定的数据对象链接后,对该对象的任何更改都将自动*反映在 DOM 中。*
*![](img/image002.png)
图 2:使用淘汰赛自动跟踪依赖关系
图 2:使用knockout自动跟踪依赖关系
这允许您关注应用程序背后的数据。设置完 HTML 模板后,您可以专门使用 JavaScript 数据对象。使用淘汰赛. js,从购物车中移除一个项目所要做的就是从代表用户购物车项目的 JavaScript 数组中移除它。相应的 HTML 元素将自动从页面中移除,总价将重新计算。
这允许您关注应用程序背后的数据。设置完 HTML 模板后,您可以专门使用 JavaScript 数据对象。使用knockout. js,从购物车中移除一个项目所要做的就是从代表用户购物车项目的 JavaScript 数组中移除它。相应的 HTML 元素将自动从页面中移除,总价将重新计算。
这定义了一个匿名函数,每当访问`PersonViewModel.fullName`时,该函数都会返回该人的全名。从现有组件(`firstName`和`lastName`)动态生成全名可以防止我们存储冗余数据,但这只是成功的一半。我们需要将这个函数传递给`ko.computed()`来创建一个计算的可观测值。这告诉淘汰赛. js,每当`firstName`或`lastName`发生变化时,它需要更新任何绑定到`fullName`属性的 HTML 元素。
这定义了一个匿名函数,每当访问`PersonViewModel.fullName`时,该函数都会返回该人的全名。从现有组件(`firstName`和`lastName`)动态生成全名可以防止我们存储冗余数据,但这只是成功的一半。我们需要将这个函数传递给`ko.computed()`来创建一个计算的可观测值。这告诉knockout. js,每当`firstName`或`lastName`发生变化时,它需要更新任何绑定到`fullName`属性的 HTML 元素。