em. setdefaultmodel

-igor

On Thu, Sep 27, 2012 at 10:09 AM, Igor Vaynberg <igor.vaynb...@gmail.com> wrote:
> i thought the issue we were discussing here is the way the models are
> linked...which is not solved by making setdefaultmodelobject
> non-public.
>
> -igor
>
> On Thu, Sep 27, 2012 at 10:04 AM, Sven Meier <s...@meiers.net> wrote:
>> If you extend GenericPanel you inherit setModel() and getModel(), that's the
>> whole purpose of this base class.
>> You want these two methods, otherwise you wouldn't extend it - there's
>> nothing to fix.
>>
>> Component#setDefaultModel() is dangerous because it allows others to tinker
>> with your component innards.
>>
>> I still think limiting access to #setDefaultModel() is a good idea, but this
>> is no crucial issue anyway.
>>
>> Sven
>>
>>
>>
>> On 09/27/2012 06:16 PM, Michael Mosmann wrote:
>>>
>>> Am 27.09.2012 17:51, schrieb Igor Vaynberg:
>>>
>>> good point..
>>> -1 from me.. thought it was a good idea, but wasn’t
>>>
>>> Michael
>>>
>>>> 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