You were right, fixed it

On Wed, Apr 6, 2016 at 6:49 PM Martin Grigorov <[email protected]> wrote:

> Please read the answers.
> On Apr 6, 2016 7:26 PM, "Ron Smits" <[email protected]> wrote:
>
> > This alas does not work:(
> >
> > First I am using wicket 7.2.0 and the getModelObject does not exist so I
> > finally made:
> >
> > @Override
> > protected void onComponentTag(ComponentTag tag) {
> >     add(new AttributeAppender("class", " number"));
> >     if(getDefaultModel().getObject() instanceof Number){
> >         Number number = (Number) getDefaultModelObject();
> >     if(number.doubleValue()<0.0)
> >         add(new AttributeAppender("class", " negative"));
> >    }
> > }
> >
> > This however gives the following exception:
> >
> > org.apache.wicket.WicketRuntimeException: Cannot modify component
> > hierarchy after render phase has started (page version cant change
> > then anymore)
> >      at
> > org.apache.wicket.Component.checkHierarchyChange(Component.java:3623)
> >      at org.apache.wicket.Component.addStateChange(Component.java:3538)
> >      at org.apache.wicket.Behaviors.add(Behaviors.java:55)
> >      at org.apache.wicket.Component.add(Component.java:4559)
> >      at
> >
> nl.codetribe.budget.web.common.MoneyLabel.onComponentTag(MoneyLabel.java:36)
> >      at
> > org.apache.wicket.Component.internalRenderComponent(Component.java:2521)
> >
> > On Fri, Apr 1, 2016 at 3:11 PM Tobias Soloschenko
> > [email protected]
> > <http://mailto:[email protected]> wrote:
> >
> > Cool - thanks!
> > >
> > > kind regards
> > >
> > > Tobias
> > >
> > > > Am 01.04.2016 um 14:56 schrieb Martin Grigorov <[email protected]
> >:
> > > >
> > > > I've added an example with
> > > >
> > >
> >
> https://github.com/apache/wicket/commit/2417322673238d57a794c237e84dd5dacf890804
> > > >
> > > > I think we should explain that those are just convenience. It is
> better
> > > to
> > > > use the "old way" one cares about memory usage. I'll add it soon.
> > > >
> > > > Martin Grigorov
> > > > Wicket Training and Consulting
> > > > https://twitter.com/mtgrigorov
> > > >
> > > > On Fri, Apr 1, 2016 at 2:48 PM, Tobias Soloschenko <
> > > > [email protected]> wrote:
> > > >
> > > >> Hi,
> > > >>
> > > >> would be great to see some information how to use lambda models in
> the
> > > >> user guide.
> > > >>
> > > >> kind regards
> > > >>
> > > >> Tobias
> > > >>
> > > >>>> Am 01.04.2016 um 13:57 schrieb Martin Grigorov <
> > [email protected]
> > > >:
> > > >>>>
> > > >>>> On Fri, Apr 1, 2016 at 12:45 AM, Sven Meier <[email protected]>
> > wrote:
> > > >>>>
> > > >>>> Hi,
> > > >>>>
> > > >>>> yeah, of course this is right:
> > > >>>>
> > > >>>>   protected void onComponentTag(final ComponentTag tag) {
> > > >>>>
> > > >>>>       if (getModelObject().doubleValue() < 0.0) {
> > > >>>>           tag.put("class", " negative");
> > > >>>>       }
> > > >>>>   }
> > > >>>>
> > > >>>> Otherwise you'll end up with one additional behavior for each
> > render -
> > > >>>> stupid copy-paste error :/.
> > > >>>>
> > > >>>> BTW this might be an additional candidate for the new Wicket 8
> > > lambdas:
> > > >>>>
> > > >>>>   label.add(onTag(tag -> if (getModelObject().doubleValue() < 0.0)
> > > >>>> tag.put("class", "negative") ));
> > > >>>
> > > >>> +1
> > > >>>
> > > >>
> > > >> +1
> > > >>
> > > >>>
> > > >>>>
> > > >>>> Sven
> > > >>>>
> > > >>>>
> > > >>>>
> > > >>>>> On 31.03.2016 21:16, Martin Grigorov wrote:
> > > >>>>>
> > > >>>>> Hi,
> > > >>>>>
> > > >>>>> On Thu, Mar 31, 2016 at 4:29 PM, Sven Meier <[email protected]>
> > wrote:
> > > >>>>>
> > > >>>>> Hi,
> > > >>>>>>
> > > >>>>>> you can access a component's model with #getDefaultModel() or -
> if
> > > it
> > > >> is
> > > >>>>>> a
> > > >>>>>> generic component - with #getModel().
> > > >>>>>>
> > > >>>>>> To properly 'bind' to a model you should delay invocation of
> > > >> #getObject()
> > > >>>>>> as late as possible, so better overwrite #onComponentTag():
> > > >>>>>>
> > > >>>>>>    protected void onComponentTag(final ComponentTag tag) {
> > > >>>>>>
> > > >>>>>>        if (getModelObject().doubleValue() < 0.0) {
> > > >>>>>>            add(new AttributeAppender("class", " negative"));
> > > >>>>>>
> > > >>>>>> Since you are in #onComponentTag() there is no reason to add a
> > > >> Behavior.
> > > >>>>> Just use the tag: tag.append("class", "negative", " ");
> > > >>>>>
> > > >>>>>
> > > >>>>>        }
> > > >>>>>>    }
> > > >>>>>>
> > > >>>>>>
> > > >>>>>> Have fun
> > > >>>>>> Sven
> > > >>>>>>
> > > >>>>>>
> > > >>>>>>
> > > >>>>>>
> > > >>>>>> On 31.03.2016 16:06, Ron Smits wrote:
> > > >>>>>>
> > > >>>>>> I have searched but I dont find a clear way of getting the model
> > > when
> > > >> one
> > > >>>>>>> is creating a custom component:
> > > >>>>>>>
> > > >>>>>>>
> > > >>>>>>> public MoneyLabel(String id) {
> > > >>>>>>>     super(id);
> > > >>>>>>>     add(new AttributeAppender("class", " number"));
> > > >>>>>>> }
> > > >>>>>>>
> > > >>>>>>> It sounds like you always need the model.
> > > >>>>> If there is a CompoundPropertyModel in the parents' hierarchy
> then
> > > move
> > > >>>>> your logic to #onComponentTag(), as per Sven's suggestion.
> > > >>>>> If there is no CPM in the parents then just remove this
> > constructor.
> > > >>>>>
> > > >>>>>
> > > >>>>> public MoneyLabel(String id, Model<? extends BigDecimal>
> > > >> bigDecimalModel)
> > > >>>>>>> {
> > > >>>>>>>     super(id, bigDecimalModel);
> > > >>>>>>>     add(new AttributeAppender("class", " number"));
> > > >>>>>>>     if (bigDecimalModel.getObject().doubleValue() < 0.0) {
> > > >>>>>>>         add(new AttributeAppender("class", " negative"));
> > > >>>>>>>     }
> > > >>>>>>> }
> > > >>>>>>>
> > > >>>>>>> In the second constructor I can use the supplied model to
> > determine
> > > >> to
> > > >>>>>>> add
> > > >>>>>>> the negative class. However in the first constructor I cannot
> > find
> > > a
> > > >> way
> > > >>>>>>> to
> > > >>>>>>> access the model.
> > > >>>>>>>
> > > >>>>>>> What am I missing?
> > > >>>>>>>
> > > >>>>>>> Ron
> > > >>>>>>> ​
> > > >>>>>>>
> > > >>>>>>>
> > > >>>>>>>
> > > ---------------------------------------------------------------------
> > > >>>>>> To unsubscribe, e-mail: [email protected]
> > > >>>>>> For additional commands, e-mail: [email protected]
> > > >>>>
> > > >>>>
> > ---------------------------------------------------------------------
> > > >>>> To unsubscribe, e-mail: [email protected]
> > > >>>> For additional commands, e-mail: [email protected]
> > > >>>>
> > > >>>>
> > > >>
> > > >>
> ---------------------------------------------------------------------
> > > >> To unsubscribe, e-mail: [email protected]
> > > >> For additional commands, e-mail: [email protected]
> > > >>
> > > >>
> > >
> > > ---------------------------------------------------------------------
> > > To unsubscribe, e-mail: [email protected]
> > > For additional commands, e-mail: [email protected]
> > >
> > > ​
> >
>

Reply via email to