在 Seaside 中获取父组件

Get parent component in Seaside

我想看看在Seaside中是否有可能在不使用session或参数传递的情况下,子组件获取对父组件的引用。也就是说,子组件调用 self 获取父组件。

简短的回答是没有简单的方法可以做到这一点。

原因是 WAComponent(以及 WAPresenter)的子类没有对父组件的直接引用,因为出于渲染目的,不需要这样做,因为访问者执行顶部向下路径并依赖于父元素引入了某种耦合,以及可能不使用的实例变量。

为了克服这个问题,我有自己的 WAComponent 子类,我们称之为 EAMComponent 这个组件有一个 parent 实例变量(在我的例子中,还有一个 model实例变量).

EAMComponent class 实现了 on: modelObject in: parentComponent(以及依赖于前者的 on:in:,受 Dolphin's implementation of Model-View-Presenter 的影响)。

那么在父组件上生成的习语是这样的:

createChildrenComponents

  dateComponent := EAMTextComponent on: self date in: self.
  footerComponent := EAMFooterComponent in: self.

然后在页脚组件中,您可以轻松引用 parent,它是作为参数传递给选择器 in: 部分的对象。

Iirc,没有引用组件的父组件是一个有意识的设计决定。保持组件解耦和独立很重要。 这并不是说 esteban 的建议是错误的,我们也实现了类似的东西。您可以这样做,但它可能会产生一些后果,例如挥之不去的引用和组件可重用性的障碍。

在 Seaside 中处理此问题的正常方法是使用公告将组件松散地连接到其 parent。 parent 连接它的 children 以发回一个通知。

参见:this example