我最近在Seaside + Squeak开发了一个Web应用程序,并发现它是一次美妙的体验。 Seaside确实比其他所有框架都要强大,我觉得我正在更高层次的抽象工作(在HTTP请求/响应周期和其他框架让你处理的HTML模板之上)。
那就是说,我对Seaside组件有点困惑。我最近不得不在组件上显示对象列表(类似于stackoverflow首页)。起初我将每个对象都作为一个组件(WAComponent的子类),但这被证明是非常浪费的,我必须在父组件中动态设置#children才能使它工作。然后我尝试使它们成为渲染对象(不是WAComponent的子类的对象,并使用renderOn渲染:而不是renderContentOn:,就像组件一样)。这工作正常,但现在他们无法再像组件那样访问会话对象中的全局状态(使用#session)。然后我发现了“WACurrentSession value”,它赋予任何对象访问当前Seaside会话对象的权限。我现在能够使它们成为渲染对象。另外,我发现我可以将很多其他更小的组件重写为渲染对象。
除了需要调用/回答或回溯状态外,还有哪些其他原因可以在渲染对象上使用组件?
答案 0 :(得分:16)
对于新的Seaside用户来说,这是一个常见的混乱点。我们在Seaside 2.9中努力使这个更清晰,目前在Alpha中,但我会尝试将重点放在2.8上,因为它听起来就像你正在使用的那样。
首先,您是正确的,您不需要使用组件来访问会话。 Seaside 2.9将#session
移动到一个新类WAObject
,这使得几乎所有Seaside对象(包括组件)都可以访问它,但你现在可以在2.8中自己引用WACurrentSession
。
组件在2.8中提供了大致以下功能:
#renderContentOn:
中指定的任何渲染器类的实例调用#rendererClass
(而不是在您的对象被要求渲染时使用的任何渲染器)#updateUrl:
),允许更新渲染器用来生成链接的URL #updateRoot:
,#style
,#script
)以允许更新HTML文档的HEAD部分#updateStates:
,#states
)让状态回溯变得更容易#initialRequest:
),允许根据导致创建会话的请求进行初始化#children
),以确保您下面的所有组件也都有上面的挂钩#inform:
,#isolate:
等)如果您不需要上述任何一种,则不需要组件。如果你需要上面的任何一个,你几乎需要一个组件,除非你想在你自己的类上实现等效的功能。
最简单的指标可能是:如果您打算在HTTP请求之间保留对象,它应该是一个Component;如果你打算抛弃对象并在每个渲染过程中创建它,它可能不需要。如果您想象一个显示博客页面的应用程序,您可能拥有菜单,博客卷,博客正文,每个评论等的组件。您可能想要考虑博客标记的读取和HTML的生成,以便您可以支持不同的标记或不同的渲染器,以便注释组件可以支持相同的标记。这可以通过实现#renderOn:
的非Component类来完成,并且可以根据需要由其他组件创建和使用。
Seaside 2.9目前通过使WAPresenter
具体化并引入WAPainter
作为其超类来分离上述功能。上面的1-3在WAPainter
和WAPresenter
上的4-7上实现,因此您可以根据需要选择子类。它还从WAPresenter和WAComponent中删除了许多方法,以使最终用户更容易理解。
希望有所帮助。