so what happens if panel A extends GenericPanel which has setModel?
you havent fixed anything.

-igor

On Thu, Sep 27, 2012 at 8:50 AM, Michael Mosmann <mich...@mosmann.de> wrote:
> Am 27.09.2012 17:32, schrieb Igor Vaynberg:
>
> Hi,
>
> .. i would leave setModel as it is, only make this change for
> Component.setDefaultModel().
>
> Michael
>
>> -1 on changing setDefaultModel().
>>
>> 1) if B panel's model is truly dependent on A's then that dependency
>> should be expressed:
>>
>> add(new BPanel("b", new PropertyModel(this, "defaultModel"));
>>
>> or do not use the default model slot of B to store the model. that way
>> setDefaultModel() calls on B will be a noop and you can choose not to
>> provide a setter.
>>
>> 2) you are only "solving" this for a subset of usecases where the
>> container (A) is not generic. are we also going to make setModel(T)
>> protected? that would require the model assignment be done through the
>> constructor only and would eliminate any possibility of writing
>> builder-style code. consider a simple example:
>>
>> new DropDownChoice("foo").setModel(bar).setChoices(baz)...
>>
>> this kind of code should be possible whether written directly by the
>> developer in the page or produced by some builder.
>>
>> -igor
>>
>>
>> On Thu, Sep 27, 2012 at 5:19 AM, Sven Meier <s...@meiers.net> wrote:
>>>
>>> Even a simpler example might fail (no PropertyModel involved):
>>>
>>>
>>> class APanel extends Panel {
>>>       APanel(String id, IModel<Some> model) {
>>>           super(id,model);
>>>
>>>           add(new BPanel("b", model);
>>>       }
>>> }
>>>
>>> A client using APanel might later change the model, leaving BPanel
>>> working
>>> on the old model:
>>>      aPanel.setDefaultModel(otherModel);
>>>
>>> You could argue that APanel should be made failsafe when passing the
>>> model:
>>>
>>>      add(new BPanel("b", new PropertyModel(this, "defaultModel")));
>>>
>>> But it would be much easier if APanel could assume that its model isn't
>>> changed unattendedly.
>>>
>>> IMHO changing a component's model isn't the "wicket way" so I'd suggest
>>> changing the visibility of Component#setDefaultModel() to protected.
>>>
>>> Sven
>>>
>>>
>>>
>>>
>>> On 09/27/2012 10:47 AM, Martin Grigorov wrote:
>>>>
>>>> I see. This is an advanced way to create a static model :-)
>>>> But again I find PropertyModel as the real problem here.
>>>>
>>>> I'll let others give their opinions too.
>>>>
>>>> On Thu, Sep 27, 2012 at 11:39 AM, Michael Mosmann <mich...@mosmann.de>
>>>> wrote:
>>>>>
>>>>> Am 27.09.2012 09:51, schrieb Martin Grigorov:
>>>>>
>>>>> Hi,
>>>>>
>>>>> a dont care about the type issue here.. Maybe i can explain it again in
>>>>> an
>>>>> other way:
>>>>>
>>>>> APanel uses model instance A and the label uses a property model
>>>>> instance
>>>>> P
>>>>> which uses a reference to model instance A.
>>>>>
>>>>> After calling APanel.setDefaultModel(B) APanel uses model instance
>>>>> B,but
>>>>> label uses model instance P which uses model instance A as before. So
>>>>> the
>>>>> label does not see any changes, because no one tells the model instance
>>>>> P,
>>>>> that it should use B instead of A. I think, there are rare cases for
>>>>> such
>>>>> a
>>>>> usage.
>>>>>
>>>>> thanks
>>>>> Michael
>>>>>
>>>>>
>>>>>> Hi,
>>>>>>
>>>>>> In this particular code I think the "problem" is PropertyModel, since
>>>>>> it brings the type unsafety.
>>>>>>
>>>>>> Another solution is to make Component<T>, this way we can remove
>>>>>> #setDefaultModel() and have #setModel(IModel<T>) only and such
>>>>>> problems will go away.
>>>>>> But as discussed in early Wicket 1.4 days this will lead to more
>>>>>> typing. With Java 7 diamonds it is half the typing though.
>>>>>>
>>>>>> For now you can use GenericPanel, GenericPage and all FormComponent.
>>>>>>
>>>>>> On Thu, Sep 27, 2012 at 10:41 AM, Michael Mosmann <mich...@mosmann.de>
>>>>>> wrote:
>>>>>>>
>>>>>>> Am 27.09.2012 09:01, schrieb Martin Grigorov:
>>>>>>> Hi,
>>>>>>>
>>>>>>> I think, there is a little difference in using setDefaultModel and
>>>>>>> setDefaultModelObject .. the first one sets a new model instance, the
>>>>>>> second
>>>>>>> only change the value in the existing model. Some pseudo-code:
>>>>>>>
>>>>>>> class APanel extends Panel {
>>>>>>>        APanel(String id,IModel<Some> model) {
>>>>>>>            super(id,model);
>>>>>>>
>>>>>>>            add(new Label("name",new
>>>>>>> PropertyModel(getDefaultModel(),"name"));
>>>>>>>        }
>>>>>>> }
>>>>>>>
>>>>>>> If you replace the value in model, everything is fine and works as
>>>>>>> expected.
>>>>>>> If you call setDefaultModel you might think, that everything is fine,
>>>>>>> but
>>>>>>> its not. A child component does not use getParent().getDefaultModel()
>>>>>>> to
>>>>>>> get
>>>>>>> these changes. I saw a lot of code like this, which leads to trouble,
>>>>>>> if
>>>>>>> you
>>>>>>> change the model and not the value.
>>>>>>>
>>>>>>> If there is no benefit in using setDefaultModel over
>>>>>>> setDefaultModelObject i
>>>>>>> would like to remove this method. This could prevent many "you might
>>>>>>> not
>>>>>>> got
>>>>>>> the full picture how to use wicket the right way" errors.
>>>>>>>
>>>>>>> Michael
>>>>>>>
>>>>>>>
>>>>>>>> Hi,
>>>>>>>>
>>>>>>>> Most of the time it is recommended to use a dynamic model, so there
>>>>>>>> is
>>>>>>>> no reason to replace the component's model.
>>>>>>>> Component#setDefaultModel() gives you semi-dynamic nature - you can
>>>>>>>> replace the model completely with a new one. Same with
>>>>>>>> #setDefaultModelObject().
>>>>>>>>
>>>>>>>> What is the problem you face with it ?
>>>>>>>>
>>>>>>>> On Thu, Sep 27, 2012 at 9:57 AM, Michael Mosmann
>>>>>>>> <mich...@mosmann.de>
>>>>>>>> wrote:
>>>>>>>>>
>>>>>>>>> Hi,
>>>>>>>>>
>>>>>>>>> is there any usefull application of Component.setDefaultModel(...)?
>>>>>>>>> IMHO
>>>>>>>>> this Method is the cause for much trouble without any benefit. But
>>>>>>>>> maybe
>>>>>>>>> i
>>>>>>>>> did not understand when someone should replace a component model...
>>>>>>>>>
>>>>>>>>> thanks
>>>>>>>>> Michael
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>
>

Reply via email to