我们在 2 月份宣布了 Grid 项目。从那时起,我们完成了前三个阶段,现在正开始进行第四阶段。在这篇文章中,我们将回顾一下到目前为止我们所构建的内容。
Grid
这就是我们设计的“零功能网格”。它所做的只是增强 HTML 表格,但它做得很好,同时还为所有类型的其他功能提供了正确的挂钩,我们可以在此基础上添加这些功能。事实证明这非常有用,因为有很多事情是普通的 HTML 表格无法做到的。使用 Grid,您可以获得
- 使用 CSS 框架进行样式设置,使其能够与 ThemeRoller 兼容
- 基于表格标题的正确标题栏
- 表格主体滚动所需的标记和样式,同时保持标题固定
Grid 的 API 控制要渲染的内容以及如何呈现内容
- columns 选项指定要渲染的列。如果未指定,它将拾取现有的表格标题元素。
- rowTemplate 选项允许网格从自定义模板渲染每一行。如果未提供此选项,则每行将根据 columns 选项生成。
- source 选项以普通对象数组的形式指定要渲染的内容。如果未指定,将使用现有的表格行。
- 默认情况下,网格的主体随行数增长。使用 heightStyle: ‘fill’,它保持固定高度,如果存在更多行,则主体将开始滚动。
- 当从现有的表格标题中获取列信息时,将读取某些 data-attribute。Grid 本身仅使用 data-property 属性(以及每个标题单元格的实际文本),但 dataFields 选项指定其他组件可以使用的一些其他属性,例如“type”、“culture”和“format”,以配置本地排序和过滤。如果网格附加组件处理其他 data-attribute,则将它们添加到 dataFields 选项将使它们作为 columns 选项的一部分自动可用。
到目前为止,我们只有一个增强的表格,但通常网格需要从某些远程资源中获取数据。这就是 Dataview 的用武之地。
Dataview
Dataview 是用于检索内容的低级抽象。它有一个 API 用于指定要检索的内容,以及一个 SPI(服务提供程序接口),由提供该内容的组件实现。内置了用于过滤、排序和分页的选项,并且设计使其易于添加更多选项,例如分组。API 默认情况下是异步的,即使对于本地数据也是如此,因此所有依赖于 Dataview 的组件都可以使用本地和远程数据。
Dataview 仅依赖于 Widget 和 Observable(我们将在下面介绍),而不依赖于 Grid。这允许 Dataview 在各种情况下使用。例如,它可以为产品列表提供支持,例如 eBay 或亚马逊上的产品列表,其中表格表示形式不是合适的格式。
Dataview SPI 使得从头开始编写实现以及创建可重用的扩展变得容易。
例如,我们可以使用自定义 dataview 作为 Autocomplete 小部件的输入。相同的数据也显示在输入字段下方的网格中。这演示了 Dataview 如何在多种表示中使用,其中每个表示都决定自己要显示哪些数据。
至于可重用的扩展,我们目前已实现三个
- localDataview 获取一个输入数组,并对该数组进行排序、分页和过滤。它使用 Globalize(见下文)来实现本地化数字和日期的过滤和排序。当与表格中的现有内容(不指定 source 选项)上的网格组合使用时,您将获得一个完整的表格排序器。
- odataDataview 获取一个资源 URL,指向理解OData(开放数据协议) 的 Web 服务。虽然我们的实现尚未涵盖所有 OData 选项,但您可以使用它进行排序、过滤和分页,而无需实现任何自定义请求/响应映射。我们有一个使用基于 OData 的 Netflix API 的网格示例。
- preloaderDataview 包装一个 Dataview 并调整分页行为以加载比渲染的更多数据,在预加载另一批之前本地分页。在这个Flickr API 幻灯片示例 中,我们预加载了 API 响应和实际图像。这将所有加载推送到后台,允许用户在没有中断的情况下浏览图像。
所有三个都需要在实际项目中进行测试,然后我们才能将其视为稳定版本。我们也正在寻找 Dataview 的其他用例,我们可能忽略了一些用例。
Observable
数据绑定目前是更新的 JavaScript 框架中的常见主题,有各种竞争解决方案可用。我们还没有一个功能齐全的替代方案,但我们开发了一个低级抽象,它可能会在将来为数据绑定组件提供支持。我们称此抽象为 Observable。它提供了一个 API 用于对可以被观察到事件监听的普通 JavaScript 对象和数组进行更改,每个更改都会触发这些事件。我们设计 Observable 具有很少的方法和事件,其目的是使其易于在其他环境中实现相同的 API。这些事件是
- change:在一个或多个属性发生更改后,在对象上触发。
- insert:在插入一个或多个新项目后,在数组上触发。
- remove:在删除一个或多个项目后,在数组上触发。
- replaceAll:在替换数组中的所有项目后,在数组上触发。
最后一个事件乍一看可能很奇怪,但它可以创建一个 dataview,将其传递给网格,让网格订阅该 dataview 的输出数组上的事件,然后在 dataview 更新时更新自身。
对于所有四个事件,Observable 提供了方法对应项
- property:用于处理对象
- insert、remove 和 replaceAll:用于处理数组。
用法在两种情况下都一致
- $.observable( object ).property( “name”, “Fred” );
- $.observable( array ).insert({ name: “Peter” });
我们仍在研究 Observable。下一步是找到一个用于数组绑定的抽象,这将从 Grid 以及待办事项应用程序演示 中移除一些开销。
当将 Observable 与 Grid 组合使用时,我们可以轻松地添加编辑功能。在我们的网格编辑演示 中,您可以向表格中添加、编辑和删除开发者。结果通过 localStorage 持久化。
我们可以使用可选择交互来选择一行或多行,然后与选择进行交互,而不是添加具有“编辑”和“删除”按钮的自定义列。在该演示中,selected
数组也是一个可观察数组,第二个网格会显示该数组。请注意,您可以选择一页上的行,转到下一页(您可能需要添加一些开发者才能显示第二页),使用 command/ctrl-单击选择更多行(以扩展选择),它将在第二个网格中显示所有这些行。选择状态与视觉表示分离,使跨多页的选择非常容易。
Globalize
Globalize 最初是从 jquery-global 插件开始的。我们将其重写为 Grid 项目的一部分,使其独立于 jQuery,允许在客户端和服务器 上使用。我们的 localDataview 实现(如上所述)使用它,它也是自定义输入(如Spinner 和Timepicker)背后的原因。
Mask、Timepicker、Selectmenu
这三个自定义输入正在作为 Grid 项目的一部分开发。它们旨在用于 Grid 中的内联编辑,以及在常规表单或网站中的独立使用。我们即将将所有三个都放到 master 分支中,以便将它们作为 1.9 的一部分发布。
还有更多...
我们仍在研究Template、Datepicker 和其他Custom Inputs。一旦我们有了更稳定的解决方案,我们将对此进行报告。
下一步
我们正在完成现有的组件,并开始进行第 4 阶段。有关详细信息,请查看主要的 Grid wiki 页面。
那么,什么时候完成呢?
我们的路线图 将 Grid 列在 2.1 版本中,而 jQuery UI 的主要关注点是 1.9。换句话说,在我们能够将 Grid 放入稳定版本并与所有其他组件一起支持它之前,还有很多工作要做。与此同时,我们鼓励您现在就开始测试上面概述的功能。Grid、Observable 和 Dataview 都非常稳定并且运行良好。Globalize 是一个独立的项目,如果您想在客户端支持本地化数字和日期处理,您现在应该开始使用它。
我们重视您的意见和帮助。请使用Developing jQuery UI 论坛,评论单个 wiki 页面或访问我们的 IRC(Freenode 上的 #jqueryui-dev)。如果您找到了解决问题的方法,请发送拉取请求。