also

protected void onDetach() {
               areaModel = null;
       }

should be just areaModel.detach();

ondetach() is called every request on the session so you are actually
nulling the model at the end of the request

-igor


On Fri, Feb 22, 2008 at 7:10 AM, Maurice Marrink <[EMAIL PROTECTED]> wrote:
> I can see the following problems:
>  -you have put the list of area's for the dropdown in the session, this
>  is fine but not required.
>   What you should have done is put a model in the session that will
>  contain a single area.
>  -you are only providing the dropdown with the options it has, not with
>  the model it should use to store the selection.
>   use something like this
>  DropDownChoice areas = new
>  
> DropDownChoice("areas",---->((WholSession)Session.get()).getAreaSelectionModel()<----,
>
> (WholSession)Session.get()).getAreaModel(), new ChoiceRenderer("name",
>  "id"));
>  where getAreaSelectionModel() is the model which contains the selected
>  area (see point 1)
>
>  The constructor you are using expects an IComponentInheritedModel
>  higher up the component tree.
>
>  Maurice
>
>
>
>  On Fri, Feb 22, 2008 at 1:44 PM, steviezz <[EMAIL PROTECTED]> wrote:
>  >
>  >  Guys - thanks for your continued help with this, but I'm still having some
>  >  problems with:
>  >
>  >    "Attempt to set model object on null model of component."
>  >
>  >  I now have some code cut down to the simplest possible example (attempting
>  >  to follow the advice given already):
>  >
>  >
>  >  public class AreaChoiceModel extends LoadableDetachableModel {
>  >         protected Object load() {
>  >             return ((WholSession) Session.get()).getAreaList();
>  >         }
>  >  }
>  >
>  >
>  >  public class WholSession extends WebSession {
>  >
>  >         private IModel areaModel = new AreaChoiceModel();
>  >
>  >         public WholSession(Request request) {
>  >                 super(request);
>  >         }
>  >
>  >         protected void onDetach() {
>  >                 areaModel = null;
>  >         }
>  >
>  >         public IModel getAreaModel() {
>  >                 return areaModel;
>  >         }
>  >
>  >         public List<Area> getAreaList() {
>  >                 return ((WholApplication) getApplication()).getAreas();
>  >         }
>  >  }
>  >
>  >
>  >
>  >  public class PanelSearch extends FormComponentPanel {
>  >
>  >         public PanelSearch(String id) {
>  >                 super(id, ((WholSession) Session.get()).getAreaModel());
>  >                 add(new SearchForm("searchForm"));
>  >                 add(new FeedbackPanel("feedback"));
>  >         }
>  >
>  >         private class SearchForm extends Form {
>  >
>  >                 public SearchForm(String id) {
>  >                      super(id);
>  >                      DropDownChoice areas = new DropDownChoice("areas",
>  >  ((WholSession)
>  >                        Session.get()).getAreaModel(), new
>  >  ChoiceRenderer("name", "id"));
>  >                     areas.setOutputMarkupId(true);
>  >                     add(areas);
>  >                 }
>  >
>  >                 protected void onSubmit() {
>  >                         System.out.println("onSubmit called");
>  >                 };
>  >         }
>  >  }
>  >
>  >
>  >  Page with panel and form loads OK with selection box populated with my top
>  >  level Area list (I've removed everything else).
>  >
>  >  Clicking the button results in the error:
>  >
>  >  WicketMessage: Method onFormSubmitted of interface
>  >  org.apache.wicket.markup.html.form.IFormSubmitListener targeted at 
> component
>  >  [MarkupContainer [Component id = searchForm, page =
>  >  sds.whol.wicket.pages.Index, path =
>  >  0:panelSearch:searchForm.PanelSearch$SearchForm, isVisible = true,
>  >  isVersioned = false]] threw an exception
>  >
>  >  Root cause:
>  >
>  >
>  >  java.lang.IllegalStateException: Attempt to set model object on null model
>  >  of component: panelSearch:searchForm:areas
>  >
>  > at org.apache.wicket.Component.setModelObject(Component.java:2850)
>  >
>  >
>  >  I'm obviously still missing something important here (or maybe I've cut 
> out
>  >  too much code :-}).  I suspect it's something very simple, so any further
>  >  pointers welcome.
>  >
>  >  Note - I've now bought the Wicket In Action eBook, so may have this worked
>  >  out once I've had time to study it in some detail.
>  >
>  >  Thanks again.
>  >
>  >
>  >
>  >
>  >
>  >
>  >
>  >  Michael O'Cleirigh wrote:
>  >  >
>  >  > Hello,
>  >  >
>  >  > This error happens because the intermediary panel between the form and
>  >  > the drop down choice does not have a model.
>  >  >
>  >  > Changing the PanelSearch constructor to call super (id, new Model())
>  >  > should fix the problem.
>  >  >
>  >  > You might also want your form panel to extend FormComponentPanel instead
>  >  > to get better validation support.
>  >  >
>  >  > Mike
>  >  >> Or you did not set the model on the dropdown.
>  >  >>
>  >  >> Maurice
>  >  >>
>  >  >> On Thu, Feb 21, 2008 at 8:44 PM, Maurice Marrink <[EMAIL PROTECTED]>
>  >  >> wrote:
>  >  >>
>  >  >>> Looks like at least one of the models in the session is not properly
>  >  >>>  initialized.
>  >  >>>  You have to do something like
>  >  >>>  private IModel model=new WhateverModel(null);
>  >  >>>  in your session.
>  >  >>>
>  >  >>>  Maurice
>  >  >>>
>  >  >>>
>  >  >>>
>  >  >>>  On Thu, Feb 21, 2008 at 8:41 PM, steviezz <[EMAIL PROTECTED]>
>  >  >>> wrote:
>  >  >>>  >
>  >  >>>  >  Now getting
>  >  >>>  >
>  >  >>>  >  RequestCycle.logRuntimeException(1399) | Attempt to set model 
> object
>  >  >>> on null
>  >  >>>  >  model of component: panelSearch:form:parentAreas
>  >  >>>  >  java.lang.IllegalStateException: Attempt to set model object on 
> null
>  >  >>> model
>  >  >>>  >  of component: panelSearch:form:parentAreas
>  >  >>>  >         at
>  >  >>> org.apache.wicket.Component.setModelObject(Component.java:2850)
>  >  >>>  >
>  >  >>>  >
>  >  >>>  >
>  >  >>>  >
>  >  >>>  >
>  >  >>>  >
>  >  >>>  >  Mr Mean wrote:
>  >  >>>  >  >
>  >  >>>  >  > Don't add wicket components to the session, use models.
>  >  >>>  >  > for example
>  >  >>>  >  > class MySession extends WebSession
>  >  >>>  >  > {
>  >  >>>  >  >  private IModel dropdown1=new WhateverModel(null); //etc for the
>  >  >>> others
>  >  >>>  >  >  // add getters() for models
>  >  >>>  >  > }
>  >  >>>  >  >
>  >  >>>  >  > class PanelSearch extends Panel
>  >  >>>  >  > {
>  >  >>>  >  >  public PanelSearch(String id)
>  >  >>>  >  > {
>  >  >>>  >  >  super(id);
>  >  >>>  >  >  add(new
>  >  >>>  >  >
>  >  >>> 
> DropDownChoice("dropdown1",((MySession)Session.get()).getDropdown1(),myChoices)
>  >  >>>  >  > }
>  >  >>>  >  > }
>  >  >>>  >  >
>  >  >>>  >  > class SomePage extends WebPage
>  >  >>>  >  > {
>  >  >>>  >  >  public SomePage()
>  >  >>>  >  > {
>  >  >>>  >  >  super();
>  >  >>>  >  >  add(new PanelSearch("search"));
>  >  >>>  >  > }
>  >  >>>  >  > }
>  >  >>>  >  >
>  >  >>>  >  > The trick is always using the shared models in your session, 
> that
>  >  >>> is
>  >  >>>  >  > why you don't need setters for them and you have to initialize
>  >  >>> them
>  >  >>>  >  > properly with some default.
>  >  >>>  >  > That way the form automatically writes the new values to your
>  >  >>> session
>  >  >>>  >  > and you don't have to do that manually.
>  >  >>>  >  >
>  >  >>>  >  > How much less code can you have?
>  >  >>>  >  >
>  >  >>>  >  > Maurice
>  >  >>>  >  >
>  >  >>>  >  > On Thu, Feb 21, 2008 at 1:44 PM, steviezz
>  >  >>> <[EMAIL PROTECTED]>
>  >  >>>  >  > wrote:
>  >  >>>  >  >>
>  >  >>>  >  >>  Thanks.
>  >  >>>  >  >>
>  >  >>>  >  >>  I have already moved to using the session for storage.  I've
>  >  >>> tried just
>  >  >>>  >  >>  adding the complete search panel object to the session in the
>  >  >>> search
>  >  >>>  >  >>  onsubmit() and fetching it again to add to the results page -
>  >  >>> this works
>  >  >>>  >  >> and
>  >  >>>  >  >>  avoids some of my page reload and history issues (but adds a 
> few
>  >  >>>  >  >> others),
>  >  >>>  >  >>  but I presume its not really a good idea to store large object
>  >  >>> graphs in
>  >  >>>  >  >> the
>  >  >>>  >  >>  session - maybe better to just store the selected values and
>  >  >>> rebuild the
>  >  >>>  >  >>  selection dropdowns as required.  Plus, this will probably 
> help
>  >  >>> me iron
>  >  >>>  >  >> out
>  >  >>>  >  >>  my inconsistent dropdown state problems.
>  >  >>>  >  >>
>  >  >>>  >  >>  But I'm still searching for a magic solution that does not
>  >  >>> involve
>  >  >>>  >  >> writing
>  >  >>>  >  >>  too much code :-}
>  >  >>>  >  >>
>  >  >>>  >  >>
>  >  >>>  >  >>
>  >  >>>  >  >>
>  >  >>>  >  >>
>  >  >>>  >  >>  Mr Mean wrote:
>  >  >>>  >  >>  >
>  >  >>>  >  >>  > I would not recommend what you are doing here.
>  >  >>>  >  >>  > What happens is that wicket removes the panel from the
>  >  >>> original page
>  >  >>>  >  >>  > and attaches it to the new page, making it impossible to use
>  >  >>> the
>  >  >>>  >  >>  > backbutton (because wicket will complain about a missing
>  >  >>> component).
>  >  >>>  >  >>  > Also this only works if the html of the new page uses the 
> same
>  >  >>>  >  >>  > component id.
>  >  >>>  >  >>  >
>  >  >>>  >  >>  > It is better to store the selection for your dropdowns in 
> the
>  >  >>> session
>  >  >>>  >  >>  > (as suggested before).
>  >  >>>  >  >>  > Then in the constructor of your PanelSearch you can check if
>  >  >>> the
>  >  >>>  >  >>  > session contains a value for the dropdowns and if that is 
> the
>  >  >>> case set
>  >  >>>  >  >>  > it as the model for the dropdown. That way you don't have to
>  >  >>> pass the
>  >  >>>  >  >>  > state to every page.
>  >  >>>  >  >>  >
>  >  >>>  >  >>  > Maurice
>  >  >>>  >  >>  >
>  >  >>>  >  >>  > On Thu, Feb 21, 2008 at 11:35 AM, steviezz
>  >  >>> <[EMAIL PROTECTED]>
>  >  >>>  >  >>  > wrote:
>  >  >>>  >  >>  >>
>  >  >>>  >  >>  >>  Answering my own questions.
>  >  >>>  >  >>  >>
>  >  >>>  >  >>  >>  I can also pass the search panel to the results page from 
> my
>  >  >>> form
>  >  >>>  >  >>  >> onSubmit:
>  >  >>>  >  >>  >>
>  >  >>>  >  >>  >>         setResponsePage(new
>  >  >>>  >  >>  >> SearchResults(((PanelSearch)this.getParent()),
>  >  >>>  >  >>  >>  search));
>  >  >>>  >  >>  >>
>  >  >>>  >  >>  >>  Then, in the results page:
>  >  >>>  >  >>  >>
>  >  >>>  >  >>  >>        public SearchResults(PanelSearch searchPanel, Search
>  >  >>> search) {
>  >  >>>  >  >>  >>                 add(searchPanel);
>  >  >>>  >  >>  >>         }
>  >  >>>  >  >>  >>
>  >  >>>  >  >>  >>  Mostly seems to work OK - panel on results page retains
>  >  >>> state from
>  >  >>>  >  >>  >> search
>  >  >>>  >  >>  >>  page.
>  >  >>>  >  >>  >>
>  >  >>>  >  >>  >>  Still getting some weird behaviour with the Ajax dropdowns
>  >  >>> on page
>  >  >>>  >  >>  >> refreshes
>  >  >>>  >  >>  >>  - can get crazy state of North America, Canada, Kansas if 
> I
>  >  >>> refresh
>  >  >>>  >  >> the
>  >  >>>  >  >>  >> page
>  >  >>>  >  >>  >>  between selection changes (old state gets mixed in with
>  >  >>> partial new
>  >  >>>  >  >>  >> state)
>  >  >>>  >  >>  >>
>  >  >>>  >  >>  >>  Other thing to sort is how to reload panel state if user
>  >  >>> goes back
>  >  >>>  >  >> to
>  >  >>>  >  >>  >> the
>  >  >>>  >  >>  >>  home page (containing search panel) via a basic external
>  >  >>> navigation
>  >  >>>  >  >> link
>  >  >>>  >  >>  >> -
>  >  >>>  >  >>  >>  panel will be in its initial blank state.  Perhaps I do 
> need
>  >  >>> to look
>  >  >>>  >  >>  >> into
>  >  >>>  >  >>  >>  loading from the session for this.
>  >  >>>  >  >>  >>
>  >  >>>  >  >>  >>  But I'm starting to like Wicket - this kind of stuff takes
>  >  >>> much more
>  >  >>>  >  >>  >> code in
>  >  >>>  >  >>  >>  other frameworks.
>  >  >>>  >  >>  >>
>  >  >>>  >  >>  >>
>  >  >>>  >  >>  >>
>  >  >>>  >  >>  >>
>  >  >>>  >  >>  >>  steviezz wrote:
>  >  >>>  >  >>  >>  >
>  >  >>>  >  >>  >>  > I am now passing the search form model to the new page 
> in
>  >  >>> the
>  >  >>>  >  >>  >> constructor,
>  >  >>>  >  >>  >>  >
>  >  >>>  >  >>  >>  >   setResponsePage(new SearchResults(search));
>  >  >>>  >  >>  >>  >
>  >  >>>  >  >>  >>  > Works OK - I assume this is better than going through 
> the
>  >  >>> session.
>  >  >>>  >  >>  >>  >
>  >  >>>  >  >>  >>  > But I have no idea (yet) how to reinitialise the search
>  >  >>> panel Ajax
>  >  >>>  >  >>  >>  > widgets.
>  >  >>>  >  >>  >>  >
>  >  >>>  >  >>  >>  >
>  >  >>>  >  >>  >>  >
>  >  >>>  >  >>  >>  >
>  >  >>>  >  >>  >>  > wicket user-2 wrote:
>  >  >>>  >  >>  >>  >>
>  >  >>>  >  >>  >>  >> store the backing model in the session and get it from
>  >  >>> the
>  >  >>>  >  >> session,
>  >  >>>  >  >>  >> this
>  >  >>>  >  >>  >>  >> will help you retain the state in all the cases
>  >  >>>  >  >>  >>  >>
>  >  >>>  >  >>  >>  >> Cheers
>  >  >>>  >  >>  >>  >> Dipu
>  >  >>>  >  >>  >>  >>
>  >  >>>  >  >>  >>  >>
>  >  >>>  >  >>  >>  >>
>  >  >>>  >  >>  >>  >
>  >  >>>  >  >>  >>  >
>  >  >>>  >  >>  >>
>  >  >>>  >  >>  >>  --
>  >  >>>  >  >>  >>  View this message in context:
>  >  >>>  >  >>  >>
>  >  >>>  >  >>
>  >  >>> 
> http://www.nabble.com/Combining-Ajax-and-non-Ajax-pages-tp15587166p15607263.html
>  >  >>>  >  >>  >>
>  >  >>>  >  >>  >>
>  >  >>>  >  >>  >> Sent from the Wicket - User mailing list archive at
>  >  >>> Nabble.com.
>  >  >>>  >  >>  >>
>  >  >>>  >  >>  >>
>  >  >>>  >  >>  >>
>  >  >>>  >  >>
>  >  >>> ---------------------------------------------------------------------
>  >  >>>  >  >>  >>  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]
>  >  >>>  >  >>  >
>  >  >>>  >  >>  >
>  >  >>>  >  >>  >
>  >  >>>  >  >>
>  >  >>>  >  >>  --
>  >  >>>  >  >>  View this message in context:
>  >  >>>  >  >>
>  >  >>> 
> http://www.nabble.com/Combining-Ajax-and-non-Ajax-pages-tp15587166p15610292.html
>  >  >>>  >  >>
>  >  >>>  >  >>
>  >  >>>  >  >> Sent from the Wicket - User mailing list archive at Nabble.com.
>  >  >>>  >  >>
>  >  >>>  >  >>
>  >  >>>  >  >>
>  >  >>> ---------------------------------------------------------------------
>  >  >>>  >  >>  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]
>  >  >>>  >  >
>  >  >>>  >  >
>  >  >>>  >  >
>  >  >>>  >
>  >  >>>  >  --
>  >  >>>  >  View this message in context:
>  >  >>> 
> http://www.nabble.com/Combining-Ajax-and-non-Ajax-pages-tp15587166p15618707.html
>  >  >>>  >
>  >  >>>  >
>  >  >>>  > Sent from the Wicket - User mailing list archive at Nabble.com.
>  >  >>>  >
>  >  >>>  >
>  >  >>>  >
>  >  >>> ---------------------------------------------------------------------
>  >  >>>  >  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]
>  >  >
>  >  >
>  >  >
>  >
>  >  --
>  >  View this message in context: 
> http://www.nabble.com/Combining-Ajax-and-non-Ajax-pages-tp15587166p15632887.html
>  >
>  >
>  > Sent from the Wicket - User mailing list archive at Nabble.com.
>  >
>  >
>  >  ---------------------------------------------------------------------
>  >  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