yeah, that could work, just return propertymodel.

-Matej

On 4/5/07, Johan Compagner <[EMAIL PROTECTED]> wrote:
Maybe we can just add bind(String) method on the compound itself instead of
bounded
because the model doesn't have to hold anything (what bounded still does,
the bindings)

johan


On 4/5/07, Matej Knopp <[EMAIL PROTECTED]> wrote:
>
> +1 for tweaking BoundCompoundPropertyModel. Right now the syntax is
> too awkward, with the model refactor it can become much much much
> esier, just like in johan's example.
>
> (it should act as compoundpropertymodel but allow binding components
> to specific property expressions)
>
> -Matej
>
> On 4/5/07, Johan Compagner <[EMAIL PROTECTED]> wrote:
> > That one really doesn't work if i understand correctly what it should do
> >
> > i guess it should do this:
> >
> > Form form = new Form(new CompoundModel(new Person))l
> > form.add(new TextField(new ComponentPropertyModel("name")))
> >
> > and then it should get name of the person of the compound?
> >
> > that really doesn't work with the current implementation.
> > And it will never work in the current setup Because how do you get from
> the
> > textfields.setModel (that sets the componentpropertymodel)
> > to the forms model where the data is in? This can only be done with some
> > kind of hack
> > currently this is the code:
> >
> > AssignmentWrapper(final Component component, final String propertyName)
> >
> >         /**
> >          * @see wicket.model.INestedModelContainer#getNestedModel()
> >          */
> >         public IModel getNestedModel()
> >         {
> >             return component.getModel();
> >         }
> >
> > And this piece of code is really wrong. the getNestedModel should return
> the
> > parent model of the current model
> > and that is not the component.getModel() because that is the
> > assigmentwrapper it self!
> >
> > then
> >         public Object getObject()
> >         {
> >             return PropertyResolver.getValue(propertyName,
> > component.getInnermostModel()
> >                     .getObject());
> >         }
> >
> >
> > component.getInnermodelModel() will throw an exception:
> >
> > IModel nested = model;
> >         while (nested != null && nested instanceof
> INestedModelContainer)
> >         {
> >             final IModel next =
> > ((INestedModelContainer)nested).getNestedModel();
> >             if (nested == next)
> >             {
> >                 throw new WicketRuntimeException("Model for " + nested +
> "
> > is self-referential");
> >
> >
> >
> > because the first nested model == AssigmentWrapper which does
> getNestedModel
> > which does component.getModel() which is again assigmentwrapper
> >
> > what you really want is this:
> >
> > public Object getObject()
> >         {
> >             return PropertyResolver.getValue(propertyName,
> > component.getParent().getModel().getObject());
> >         }
> >
> >
> > so by pass the component and go straight to its parent
> >
> > so AssignmentWrapper will be then this:
> >
> > static private class AssignmentWrapper extends AbstractReadOnlyModel
> >             implements
> >                 INestedModelContainer
> >     {
> >         private static final long serialVersionUID = 1L;
> >
> >         private final Component component;
> >
> >         private final String propertyName;
> >
> >         AssignmentWrapper(final Component component, final String
> > propertyName)
> >         {
> >             this.component = component;
> >             this.propertyName = propertyName;
> >         }
> >
> >         /**
> >          * @see wicket.model.INestedModelContainer#getNestedModel()
> >          */
> >         public IModel getNestedModel()
> >         {
> >             return ComponentPropertyModel.this;
> >         }
> >
> >         protected String propertyExpression()
> >         {
> >             return propertyName;
> >         }
> >
> >         public Object getObject()
> >         {
> >             return PropertyResolver.getValue(propertyName,
> > component.getParent().getModel().getObject());
> >         }
> >     }
> >
> > then it should work.
> >
> > But why do we need this model? this doesn't really save anything or add
> > anything
> > you still have to do this:
> >
> > Form form = new Form(new CompoundModel(new Person))l
> > form.add(new TextField("couldntbename",new
> ComponentPropertyModel("name")))
> >
> > so thats almost as much as:
> >
> >
> > Model model = new Model(new Person);
> > Form form = new Form(model);
> > form.add(new TextField("couldntbename",new PropertyModel("name",model)))
> >
> > and it is more or less tries to replace the BoundCompoundPropertyModel:
> >
> >
> > BoundCompoundPropertyModel model = new BoundCompoundPropertyModel(new
> > Person);
> > Form form = new Form(model);
> > form.add(model.bind(new TextField("couldntbename"),"name"));
> >
> > So we better tweak BoundCompoundPropertyModel:
> >
> > BoundCompoundPropertyModel model = new BoundCompoundPropertyModel(new
> > Person);
> > Form form = new Form(model);
> > form.add(new TextField("couldntbename",model.bind("name")));
> >
> > so add (or change) the bind method that it just gets a string property
> and
> > returns the model (which is a wrapper around the component and the
> property
> > name)
> >
> > thats much neater
> >
> >
> > johan
> >
>

Reply via email to