oh yeah ... in detach() you have to call delegate.detach()
-Igor


On 3/30/06, Igor Vaynberg <[EMAIL PROTECTED] > wrote:
I think this is because of the listitem model. the listitem model biggybacks off the listview model so for every row it makes a call.

you can wrap the PropertyModel with some sort of a CachingModel that would cache the value returned from the PropertyModel for the duration of the request.

Something like this:


class RequestCachingModel implements IModel {
   private IModel delegate;
   private transient Object cache;
   private transient boolean cached=false;

   public RequestCachingModel(IModel delegate) {
       this.delegate=delegate;
   }

   public Object getObject(Component c) {
       if (!cached) {
          cache=delegate.getObject(c);
          cached=true;
       }
      return cache;
   }

  public Object setObject(Component c, Object o) {
        delegate.setObject(o);
       detach();
  }

  public void detach() {
        cached=false;
         cache=null;
  }

....
}


hope this helps
-Igor

  

On 3/30/06, Millard, Stuart <[EMAIL PROTECTED] > wrote:

The class in question:

 

public final class LevelsPage extends AuthenticatedWebPage

{

            private ArrayList levels;

            /**

             * Constructor

             *

             * @param parameters

             */

            public LevelsPage(final PageParameters parameters)

            {

                        // Add table of levels

                        final PageableListView listView;

                        add(listView = new PageableListView("levels", new PropertyModel(this, "levels"), 8)

                        {

                                    public void populateItem(final ListItem listItem)

                                    {

                                                final Level level = (Level)listItem.getModelObject();

                        listItem.add(new TextField("name", new Model(level.getName())));

                        listItem.add(new TextField("number", new Model(new Integer(level.getNumber()))));

                        listItem.add(new Button("delete"));

                                    }

                        });

 

                        // Add new level button

                        Button addLevelButton = new Button("addlevel") {

            protected void onSubmit() {

                System.out.println("Add new level selected");

            }

        };

                        Link addGroupButton = new Link("addLevel") {

                    public void onClick() {

                        levels.add(new Level(110, "Level1", 25));

                    }

                };

                add(addGroupButton);

        add(addLevelButton);

       

        add(new PagingNavigator("levelnavigator", listView));

            }

           

            /**

             *

             * @return List of levels

             */

            public List getLevels()

            {

                        if(levels==null){

                                    levels = new ArrayList();

                        }

        levels.add(new Level(100, "Admin", 0));

        levels.add(new Level(101, "Supervisor", 10));

        levels.add(new Level(102, "Group", 15));

        levels.add(new Level(103, "Normal", 20));

        levels.add(new Level(104, "Limited", 25));

        levels.add(new Level(105, "Web", 50));

        return levels;                     

            }

}

 



Reply via email to