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

new*_*ker 17 smalltalk squeak seaside

我最近在Seaside + Squeak开发了一个Web应用程序,并发现它是一种美妙的体验.Seaside真的比其他所有框架都要强大,我觉得我正在更高层次的抽象工作(在HTTP请求/响应周期和其他框架让你处理的HTML模板之上).

那就是说,我对Seaside组件有点困惑.我最近不得不在组件上显示对象列表(类似于stackoverflow首页).起初我将每个对象都设置为一个组件(WAComponent的子类),但这被证明是非常浪费的,我必须在父组件中动态设置#children才能使其工作.然后我尝试使它们成为渲染对象(不是WAComponent的子类的对象,并使用renderOn渲染:而不是renderContentOn:,就像组件一样).这工作正常,但现在他们无法再像组件那样访问会话对象中的全局状态(使用#session).然后我发现了"WACurrentSession value",它赋予任何对象访问当前Seaside会话对象的权限.我现在能够使它们成为渲染对象.另外,我发现我可以将很多其他更小的组件重写为渲染对象.

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

Jul*_*ian 16

对于新的Seaside用户来说,这是一个常见的混乱点.我们在Seaside 2.9中努力使这个更清晰,目前在Alpha中,但我会尝试将重点放在2.8这里,因为它听起来就像你正在使用的那样.

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

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

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

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

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

Seaside 2.9目前通过制作WAPresenter混凝土和引入WAPainter其超类来分离上述功能.上面的1-3是在WAPainter4-7上实现的,WAPresenter因此您可以根据需要选择子类.它还从WAPresenter和WAComponent中删除了许多方法,以使最终用户更容易理解.

希望有所帮助.