gpt4 book ai didi

smalltalk - 何时使用 Seaside 组件,何时使用简单的渲染对象?

转载 作者:行者123 更新时间:2023-12-03 14:12:10 25 4
gpt4 key购买 nike

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

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

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

最佳答案

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

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

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

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

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

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

    Seaside 2.9 目前通过制作 WAPresenter 来拆分上述功能。具体介绍 WAPainter作为它的父类(super class)。以上1-3在 WAPainter上实现和 WAPresenter 上的 4-7因此,您可以根据需要选择要子类化的内容。它还从 WAPresenter 和 WAComponent 中删除了许多方法,以使最终用户更容易理解它们。

    希望有帮助。

    关于smalltalk - 何时使用 Seaside 组件,何时使用简单的渲染对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/838048/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com