对于 Seaside 新用户来说,这是一个常见的困惑点。我们已经努力在 Seaside 2.9(目前处于 Alpha 阶段)中更清楚地说明这一点,但我将在这里尝试专注于 2.8,因为这听起来像是您正在使用的。
首先,您不需要使用组件来访问会话是正确的。Seaside 2.9#session
升级到一个新类WAObject
,几乎所有 Seaside 对象(包括组件)都可以访问它,但您现在绝对可以WACurrentSession
在 2.8 中引用自己。
组件在 2.8 中大致提供以下功能:
#renderContentOn:
使用您在其中指定的任何渲染器类的实例调用#rendererClass
(而不是在要求您的对象渲染自身时使用的任何渲染器)
- 一个钩子 (
#updateUrl:
) 允许更新渲染器用来生成链接的 URL
- 挂钩 (
#updateRoot:
, #style
, #script
) 允许更新 HTML 文档的 HEAD 部分
- 成为应用程序根的能力
- 钩子 (
#updateStates:
, #states
) 使状态回溯更容易
- 一个钩子 (
#initialRequest:
) 允许根据导致创建 Session 的请求进行初始化
- 一个工具 (
#children
) 确保你下面的所有组件也将调用上面的钩子
- 添加装饰品的能力
- 显示/接听/呼叫的能力(使用装饰品)
- 一些方便的方法(
#inform:
,#isolate:
等)
如果您不需要上述任何一项,则不需要组件。如果您需要上述任何一项,那么您几乎确实需要一个组件,除非您想在自己的类上实现等效的功能。
最简单的衡量标准可能是:如果您打算在 HTTP 请求之间保留对象,则它应该是一个组件;如果您打算丢弃对象并在每次渲染过程中创建它,则可能不需要。如果您想像一个显示博客页面的应用程序,您可能会有用于菜单、博客卷、博客正文、每条评论等的组件。您可能需要考虑阅读博客的标记和生成其 HTML,以便您可以支持不同的标记或不同的渲染器,并且评论组件可以支持相同的标记。这可以通过一个非组件类来完成,该类实现#renderOn:
并可以根据需要由其他组件创建和使用。
WAPresenter
Seaside 2.9 目前通过具体化并WAPainter
作为其超类引入来拆分上述功能。上面的 1-3WAPainter
和 4-7都实现了,WAPresenter
因此您可以根据需要选择要子类化的内容。它还从 WAPresenter 和 WAComponent 中删除了许多方法,以使最终用户更容易理解它们。
希望有帮助。