Smalltalk 何时使用海滨组件,何时使用简单渲染对象?

Smalltalk 何时使用海滨组件,何时使用简单渲染对象?,smalltalk,squeak,seaside,Smalltalk,Squeak,Seaside,我最近一直在Seaside+Squeak开发一个web应用程序,我发现这是一次非常棒的体验。Seaside确实比其他任何框架都高得多,我感觉自己在更高的抽象层次上工作(比其他框架让您处理的HTTP请求/响应周期和HTML模板更高) 也就是说,我对海边的组件有点困惑。我最近不得不在一个组件上显示一个对象列表(类似于stackoverflow首页)。起初,我将每个对象作为一个组件(WAComponent的子类),但事实证明这是非常浪费的,我必须在父组件中动态设置#children,使其能够工作。然后

我最近一直在Seaside+Squeak开发一个web应用程序,我发现这是一次非常棒的体验。Seaside确实比其他任何框架都高得多,我感觉自己在更高的抽象层次上工作(比其他框架让您处理的HTTP请求/响应周期和HTML模板更高)

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


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

对于新的Seaside用户来说,这是一个常见的困惑点。在Seaside 2.9中,我们已经尽力使它更清晰,它目前在Alpha中,但我将在这里集中讨论2.8,因为它听起来像是您正在使用的

首先,您认为访问会话不需要使用组件是正确的。Seaside 2.9将
#session
升级到一个新类
WAObject
,这使得几乎所有Seaside对象(包括组件)都可以访问它,但您现在可以在2.8中明确地参考
WACurrentSession

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

  • #renderContentOn:
    通过在
    #renderClass
    中指定的任何渲染器类的实例调用(而不是在要求对象渲染自身时使用的任何渲染器)
  • 一个钩子(
    #updateUrl:
    ),用于更新渲染器用于生成链接的URL
  • 钩子(
    #updateRoot:
    #style
    #script
    )允许更新HTML文档的头部分
  • 成为应用程序根目录的能力
  • 钩子(
    #updateStates:
    #states
    )使状态回溯更容易
  • 一个钩子(
    #initialRequest:
    ),允许基于导致创建会话的请求进行初始化
  • 一个工具(
    #children
    ),用于确保下面的所有组件也将调用上述挂钩
  • 添加装饰的能力
  • 显示/应答/呼叫的能力(使用装饰)
  • 一些方便的方法(
    #通知:
    #隔离:
    ,等等)
  • 如果不需要上述任何一项,则不需要组件。如果您需要上述任何一项,您几乎需要一个组件,除非您想在自己的类上实现等效的功能

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

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


    希望能有所帮助。

    谢谢您的详细回复!