将 Extjs 与 HAL 集成
Integrate Extjs with HAL
如何使用 ExtJS (v4.1) 客户端绑定 Spring 输出 HAL 的 DATA REST,ExtJS 不支持 HAL,但我如何集成 Hyperagent.js 或任何支持 HAL 的 JS 库,具有 Extjs 数据模型,以 link 通过 HAL 与服务器存储。
这种架构的优缺点是什么?
这是一个很有趣的问题。关于如何将 ExtJs 连接到后端的信息不多。当我开始为 ajax 代理开发自定义后端时,我没有找到我正在寻找的信息。我只能以我有限的经验写一个肯定有偏见的答案,希望你能从不同的角度得到其他答案。
我的想法是编写一个通用的、符合标准的、与客户端无关的 RESTful API 来公开数据库中的 table。最后,我得到了一个高度特定于 ExtJs 的后端,它实现了许多我认为属于前端的功能。
ExtJs 对后端的强加
ExtJs 在视图和商店之间有着严格的关系。视图绑定到直接绑定到后端的商店。这要求后端必须提供数据,因为它将显示在网格中。真正遗漏的(ExtJs 5 在某种程度上减轻了这一点)是利用另一个商店的数据创建一个商店的能力。这导致有义务以与最终视图相关的自定义方式公开数据(我们已经放松了 API 和应用程序之间的关注点分离)。
当您想使用分页、远程过滤或排序等功能时,这会更进一步。如果您在某个时候拥有大量数据,则由于性能问题,您将不得不这样做。 ExtJs 发送分页参数的方式(默认情况下启用)、排序和过滤对我来说很奇怪,我认为这将需要您在此时调整您的后端以适应 ExtJs。如果你经常使用过滤器,你甚至需要在后端配置它们,因为像 starts with vs contains 和 case sensitivity 之类的过滤器属性不幸地无法进入服务器。再次展示元素更多地介绍自己到后端。
ExtJs 4 对关联的支持有限(并且与版本 5 不兼容)。 ExtJs 不支持 REST 的高级功能,例如 @Jaimie 链接的 post 中解释的功能。 ExtJs 有一个扁平的 REST 方法,每个 table 都有自己的端点。有一种方法可以从树状数据结构中的链接 table 发送数据,我无法让它工作,但如果你实现它,你最终会在你的中获得另一个 ExtJs 特定功能后端。
我目前的做法
鉴于 ExtJs 方面的所有这些要求,我感到被迫编写一些真正特定于 ExtJs 的东西。我一开始试图避免的现在是我后端的力量:特异性。
我有一个 class 可以为任何 mysql table 实现 crud 操作、分页、过滤和排序,所有这些都通过身份验证进行保护。它完全按照 ExtJs 的期望去做。
我可以为 table 创建一个子 class 以允许更细粒度的控制:
- 使用 ACL 的授权
- 提供连接或视图
- 更新或删除前的扩展验证
- 自定义过滤器
- 通过 websocket 发送特殊操作通知
- 将任何数据公开为 table(例如目录中的文件列表)
结论
如您所见,后端功能非常强大,远非单纯的数据提供者。
这不是您关于如何集成 HAL REST 的问题的答案 api,但它以某种方式回答了利弊部分:ExtJs 对其后端有如此具体的要求,如果不实施它们,您会松散太多的功能。修改 ExtJs 连接到服务器的方式可能是一个选项,但我不知道您必须在多大程度上重写代码。它可能需要大量投资。
如何使用 ExtJS (v4.1) 客户端绑定 Spring 输出 HAL 的 DATA REST,ExtJS 不支持 HAL,但我如何集成 Hyperagent.js 或任何支持 HAL 的 JS 库,具有 Extjs 数据模型,以 link 通过 HAL 与服务器存储。
这种架构的优缺点是什么?
这是一个很有趣的问题。关于如何将 ExtJs 连接到后端的信息不多。当我开始为 ajax 代理开发自定义后端时,我没有找到我正在寻找的信息。我只能以我有限的经验写一个肯定有偏见的答案,希望你能从不同的角度得到其他答案。
我的想法是编写一个通用的、符合标准的、与客户端无关的 RESTful API 来公开数据库中的 table。最后,我得到了一个高度特定于 ExtJs 的后端,它实现了许多我认为属于前端的功能。
ExtJs 对后端的强加
ExtJs 在视图和商店之间有着严格的关系。视图绑定到直接绑定到后端的商店。这要求后端必须提供数据,因为它将显示在网格中。真正遗漏的(ExtJs 5 在某种程度上减轻了这一点)是利用另一个商店的数据创建一个商店的能力。这导致有义务以与最终视图相关的自定义方式公开数据(我们已经放松了 API 和应用程序之间的关注点分离)。
当您想使用分页、远程过滤或排序等功能时,这会更进一步。如果您在某个时候拥有大量数据,则由于性能问题,您将不得不这样做。 ExtJs 发送分页参数的方式(默认情况下启用)、排序和过滤对我来说很奇怪,我认为这将需要您在此时调整您的后端以适应 ExtJs。如果你经常使用过滤器,你甚至需要在后端配置它们,因为像 starts with vs contains 和 case sensitivity 之类的过滤器属性不幸地无法进入服务器。再次展示元素更多地介绍自己到后端。
ExtJs 4 对关联的支持有限(并且与版本 5 不兼容)。 ExtJs 不支持 REST 的高级功能,例如 @Jaimie 链接的 post 中解释的功能。 ExtJs 有一个扁平的 REST 方法,每个 table 都有自己的端点。有一种方法可以从树状数据结构中的链接 table 发送数据,我无法让它工作,但如果你实现它,你最终会在你的中获得另一个 ExtJs 特定功能后端。
我目前的做法
鉴于 ExtJs 方面的所有这些要求,我感到被迫编写一些真正特定于 ExtJs 的东西。我一开始试图避免的现在是我后端的力量:特异性。
我有一个 class 可以为任何 mysql table 实现 crud 操作、分页、过滤和排序,所有这些都通过身份验证进行保护。它完全按照 ExtJs 的期望去做。
我可以为 table 创建一个子 class 以允许更细粒度的控制:
- 使用 ACL 的授权
- 提供连接或视图
- 更新或删除前的扩展验证
- 自定义过滤器
- 通过 websocket 发送特殊操作通知
- 将任何数据公开为 table(例如目录中的文件列表)
结论
如您所见,后端功能非常强大,远非单纯的数据提供者。
这不是您关于如何集成 HAL REST 的问题的答案 api,但它以某种方式回答了利弊部分:ExtJs 对其后端有如此具体的要求,如果不实施它们,您会松散太多的功能。修改 ExtJs 连接到服务器的方式可能是一个选项,但我不知道您必须在多大程度上重写代码。它可能需要大量投资。