Igor,
I'm glad to hear that!
I hadn't thought of removing the IModel reference from Component, but
that's a good idea. I think that you'd want to keep the model
reference itself inside Component, using the data field as it exists
now, but make the access methods protected.
My original thought a few days ago was that Component should implement
IModel. In other words, make models *optional*. If an app needs an
IModel instance (because the model is detachable or dynamic), then it
uses one, otherwise it just stores the model object itself in
Component's data field. That would eliminate the need to create lots
of plain vanilla Model instances and save memory. However, I tried to
implement this and ran into lots of issues, the least of which is that
Component doesn't know what class of model object its subclasses will
use.
The reason for having Component implement IModel is so that when the
code requires an IModel, the component can stand in. But maybe that's
not necessary. Maybe what would be better is to simply eliminate the
assumption that IModel is necessary for anything. So Component (or a
subclass) is backed up an an object, the class of which depends on the
component, and which may (at runtime) actually be an IModel instance.
Anyway if there are no objections I'd like to add this to the Wiki as
a discussion for 1.5?
W
On Apr 26, 2009, at 1:18 PM, Igor Vaynberg wrote:
actually in 1.5 i was hoping to find a way to get rid of
icomponentassignedmodel or any other automatic model wrapping voodoo.
the idea is that if a user needs a model they add their own imodel<t>
field. this will get rid of the generic mess surrounding
getdefaultmodel/getmodel, etc. so a component wont have a default
model slot any more.
not sure if it will work, but this is something i want to try. so a
heads up.
-igor
On Sun, Apr 26, 2009 at 6:24 AM, Willis Blackburn <[email protected]>
wrote:
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