17

我最近一直在 Seaside+Squeak 中开发一个 Web 应用程序,并发现它是一次美妙的体验。Seaside 确实比其他所有框架都遥遥无期,我觉得我好像在更高层次的抽象上工作(在其他框架让你处理的 HTTP 请求/响应周期和 HTML 模板之上)。

也就是说,我对 Seaside 组件有点困惑。我最近不得不在一个组件上显示一个对象列表(类似于 stackoverflow 的首页)。起初我将每个对象都设为一个组件(WAComponent 的子类),但事实证明这非常浪费,而且我必须在父组件中动态设置#children 才能使其正常工作。然后我尝试让它们呈现对象(不是 WAComponent 子类的对象,并使用 renderOn: 而不是 renderContentOn: 进行呈现,就像组件一样)。这行得通,但现在他们不能再像组件那样访问会话对象中的全局状态(使用#session)。然后我发现了“WACurrentSession 值”,它使任何对象都可以访问当前的 Seaside 会话对象。我现在能够让它们渲染对象。此外,

除了需要呼叫/应答或回溯状态之外,还有哪些其他原因需要使用组件而不是渲染对象?

4

1 回答 1

16

对于 Seaside 新用户来说,这是一个常见的困惑点。我们已经努力在 Seaside 2.9(目前处于 Alpha 阶段)中更清楚地说明这一点,但我将在这里尝试专注于 2.8,因为这听起来像是您正在使用的。

首先,您不需要使用组件来访问会话是正确的。Seaside 2.9#session升级到一个新类WAObject,几乎所有 Seaside 对象(包括组件)都可以访问它,但您现在绝对可以WACurrentSession在 2.8 中引用自己。

组件在 2.8 中大致提供以下功能:

  1. #renderContentOn:使用您在其中指定的任何渲染器类的实例调用#rendererClass(而不是在要求您的对象渲染自身时使用的任何渲染器)
  2. 一个钩子 ( #updateUrl:) 允许更新渲染器用来生成链接的 URL
  3. 挂钩 ( #updateRoot:, #style, #script) 允许更新 HTML 文档的 HEAD 部分
  4. 成为应用程序根的能力
  5. 钩子 ( #updateStates:, #states) 使状态回溯更容易
  6. 一个钩子 ( #initialRequest:) 允许根据导致创建 Session 的请求进行初始化
  7. 一个工具 ( #children) 确保你下面的所有组件也将调用上面的钩子
  8. 添加装饰品的能力
  9. 显示/接听/呼叫的能力(使用装饰品)
  10. 一些方便的方法(#inform:,#isolate:等)

如果您不需要上述任何一项,则不需要组件。如果您需要上述任何一项,那么您几乎确实需要一个组件,除非您想在自己的类上实现等效的功能。

最简单的衡量标准可能是:如果您打算在 HTTP 请求之间保留对象,则它应该是一个组件;如果您打算丢弃对象并在每次渲染过程中创建它,则可能不需要。如果您想像一个显示博客页面的应用程序,您可能会有用于菜单、博客卷、博客正文、每条评论等的组件。您可能需要考虑阅读博客的标记和生成其 HTML,以便您可以支持不同的标记或不同的渲染器,并且评论组件可以支持相同的标记。这可以通过一个非组件类来完成,该类实现#renderOn:并可以根据需要由其他组件创建和使用。

WAPresenterSeaside 2.9 目前通过具体化并WAPainter作为其超类引入来拆分上述功能。上面的 1-3WAPainter和 4-7都实现了,WAPresenter因此您可以根据需要选择要子类化的内容。它还从 WAPresenter 和 WAComponent 中删除了许多方法,以使最终用户更容易理解它们。

希望有帮助。

于 2009-05-08T08:05:52.553 回答