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中提供了大致以下功能:
#renderContentOn:使用您指定的任何渲染器类的实例调用#rendererClass(而不是在您的对象被要求渲染自身时使用的任何渲染器)#updateUrl:),允许更新渲染器使用的URL来生成链接#updateRoot:,#style,#script),以允许在更新HTML文档的HEAD部分#updateStates:,#states)使状态回溯更容易#initialRequest:),允许根据导致创建Session的请求进行初始化#children),以确保您下面的所有组件也将调用上面的钩子#inform:,#isolate:等)如果您不需要上述任何一项,则不需要组件.如果你需要上面的任何一个,你几乎需要一个Component,除非你想在你自己的类上实现等效的功能.
最简单的度量标准可能是:如果您打算在HTTP请求之间保留对象,那么它应该是一个Component; 如果你打算抛弃对象并在每个渲染过程中创建它,它可能不需要.如果您想象一个显示博客页面的应用程序,您可能拥有菜单,博客卷,博客正文,每个评论等的组件.您可能想要考虑博客标记的读取和HTML的生成,以便您可以支持不同的标记或不同的渲染器,以便注释组件可以支持相同的标记.这可以通过非Component组来完成,该类实现#renderOn:并可以根据需要由其他组件创建和使用.
Seaside 2.9目前通过制作WAPresenter混凝土和引入WAPainter其超类来分离上述功能.上面的1-3是在WAPainter4-7上实现的,WAPresenter因此您可以根据需要选择子类.它还从WAPresenter和WAComponent中删除了许多方法,以使最终用户更容易理解.
希望有所帮助.