我想知道在Seaside中,是否有可能在不使用会话或参数通道的情况下,子组件获得对父组件的引用。也就是说,子组件在调用self的时候,会得到父组件的引用。
简单的回答是,没有简单的方法可以做到这一点。
原因是,子类的 WAComponent
(还 WAPresenter
)没有直接引用父组件,因为出于渲染的目的,不需要这样做,因为访问者执行的是一个自上而下的路径,并且依赖于父元素会引入某种耦合,以及一个可能不使用的实例变量。
为了克服这个问题,我有自己的 WAComponent
子类,就叫它 EAMComponent
而这个组件有一个 parent
实例变量(在我的情况下,也是一个 model
实例变量)。)
该 EAMComponent class
实施 on: modelObject in: parentComponent
(以及 on:
和 in:
受前者的影响,依附于后者的 Dolphin对Model-View-Presenter的实现。).
因此,在父组件上,产生的成语是这样的。
createChildrenComponents
dateComponent := EAMTextComponent on: self date in: self.
footerComponent := EAMFooterComponent in: self.
然后在页脚组件中,你可以很容易地引用到 parent
的对象作为参数传递给 in:
的一部分。
我认为,不引用组件的父类是一个有意识的设计决定。这对于保持组件的解耦和自足是很重要的。这并不是说esteban的建议是错误的,我们也实现了类似的东西。你可以这样做,但可能会产生一些后果,比如残留的引用和对组件可重用性的障碍。
在Seaside中,处理这个问题的正常方法是使用公告将组件松散地连接到它的父节点。父组件给它的子组件接上线,给它发回一个公告。
请看 这个例子