Wicket developers,

I've been experimenting with some changes to Wicket's model handling for a future release and would like to start a discussion, maybe on the Wiki page? But I wanted to run it by you all first to get your opinions.

I have two ideas.

My first idea is to refactor IComponentAssignedModel+IWrapModel. IComponentAssignedModel is not really a model: it's a model factory. When the application passed one to a component, it's the factory- generated model that's actually used.

The problem is that developers have to consider IComponentAssignedModel every time they use IModel. Every IModel instance must be "wrapped" before it can be used because it might be IComponentAssignedModel. This goes against the spirit of IModel being a simple indirection interface.

I think something like an IComponentAwareModel with a single method, setComponent, would work better. The model would be simply associated with its component, rather than being used as a factory to generate the real model. All IModel references would refer to valid models, even if they have not yet been associated with a component. Chained models would implement IComponentAwareModel and pass the component to their inner models.

I realize that this change might require some applications to instantiate a separate model for each component rather than use the "same" model over and over, but that's what's happening behind the scenes anyway. It doesn't seem like an onerous change. After all the app is already instantiating the components.

I implemented this in a copy of the Wicket 1.4 trunk. It only took about an hour, and all of the unit tests passed.

My second idea is to move the IComponentInheritedModel-searching logic from Component into an actual IModel implementation. That would allow applications to *explicitly* assign the searching functionality to a component, rather than have it implicitly invoked in initModel when the component has no model. This is important because currently, the searching logic only runs if initModel is actually called.

What I'm trying to do is develop complex, reusable components that instantiate all of their child components in the constructor. This is tricky because in the constructor, the component does not yet know what its parent will be, and it may not even know what its model will be. I want to allow users of my components to use them as they would labels: they should be able to provide an explicit model, or provide no model and have the component inherit a model. But because my components are complex and have lots of child components, I don't want to explicitly assign a model to each child component. I want to wrap the component's model in CompoundPropertyModel. The two changes that I've suggested would make it a lot easier to build complex components in this manner.

Sorry so long.  :-)

Regards,
Willis

Reply via email to