java-小门使用ajax在不同面板中刷新listView

大家好,我是Wicket的新手,我开始玩这个框架.
我知道这将是一个非常无用的示例,但我尝试将其用于学习检票基础.
这是我的情况:

我得到一个页面IndexPage.java,该页面基本上由两个面板组成,第一个是ListCheesePanel.java(它基本上显示带有价格等的奶酪列表,以及用于将选择的奶酪添加到购物车的按钮),第二个一个是CartPanel.java,它本质上是一个购物车,您可以在其中拥有所有选定的奶酪,然后可以继续检出.

我基本上会使用ajax行为将列表中的奶酪添加到购物车中:

ListCheesePanel.java

public abstract class ListCheesePanel extends GenericPanel<List<Cheese>>{

    private static final long serialVersionUID = 1L;

    public ListCheesePanel(String id,final IModel<List<Cheese>> listCheeseModel) {
        super(id,listCheeseModel);
        PageableListView<Cheese> cheeses = new PageableListView<Cheese>("cheeses", listCheeseModel, 4) {

            private static final long serialVersionUID = 1L;

            @Override
            protected void populateItem(final ListItem<Cheese> item) {

                Cheese cheese = (Cheese) item.getModelObject();
                item.addOrReplace(new Label("name", Model.of(cheese.getName())));
                item.addOrReplace(new Label("description", Model.of(cheese.getDescription())));
                item.addOrReplace(new Label("price", Model.of("$" + cheese.getPrice())));
                item.addOrReplace(new AjaxFallbackLink<Cheese>("add",item.getModel()) {

                    private static final long serialVersionUID = 1L;

                    @Override
                    public void onClick(AjaxRequestTarget target) {
                        elementClicked(target, item.getModelObject());
                    }
                });
            }
        };
        addOrReplace(cheeses);
        addOrReplace(new PagingNavigator("navigator", cheeses));
    }

    protected abstract void elementClicked(AjaxRequestTarget target,Cheese cheese);
}

elementClicked是必须使用ovverride的方法,以指示奶酪和目标.

CartPanel.java

public abstract class CartPanel extends GenericPanel<Cart>{

    private static final long serialVersionUID = 1L;

    private WebMarkupContainer cartContainer;
    private ListView<Cheese> cheesesList;   
    private Link<Cart> checkOutLink;
    private boolean checkOutButtonVisibility;

    public CartPanel(String id,final IModel<Cart> cartModel,final boolean checkOutButtonVisibility) {
        super(id,cartModel);
        this.checkOutButtonVisibility=checkOutButtonVisibility;
        cartContainer = new WebMarkupContainer("cartContainer");
        cartContainer.setOutputMarkupId(true);
        addOrReplace(cartContainer);
        cheesesList = new ListView<Cheese>("cart" , getModelObject().getCheeses()){

            private static final long serialVersionUID = 1L;

            @Override
            protected void populateItem(final ListItem<Cheese> item) {
                Cheese cheese = item.getModelObject();
                item.addOrReplace(new Label("name",cheese.getName()));
                item.addOrReplace(new Label("price",cheese.getPrice()));
                item.addOrReplace(new Link<Cheese>("remove",item.getModel()) {

                    private static final long serialVersionUID = 1L;

                    @Override
                    public void onClick() {
                        removeElement(item.getModelObject());
                    }
                });
            }
        };

        cheesesList.setOutputMarkupId(true);        
        cartContainer.addOrReplace(cheesesList);
        cartContainer.addOrReplace(new Label("total",new PropertyModel<Long>(cartModel.getObject(), "total")));

        checkOutLink = new Link<Cart>("checkOut",getModel()){

            private static final long serialVersionUID = 1L;

            @Override
            public void onClick() {
                setResponsePage(new CheckOutPage(getModel()));
            }

            @Override
            protected void onConfigure() {
                super.onConfigure();
                Cart cart = cartModel.getObject();
                List<Cheese> cheeseList = cart.getCheeses();
                setVisible(isCheckOutButtonVisibility() && !cheeseList.isEmpty());
            }

       };    

       addOrReplace(checkOutLink);
    }

    protected abstract void removeElement(Cheese modelObject);

    /* Getters and Setters */

    public boolean isCheckOutButtonVisibility() {
        return checkOutButtonVisibility;
    }
}

IndePage.java

public class IndexPage extends CheeseTemplate {

    private static final long serialVersionUID = 1L;
    private static List<Cheese> cheeses = Arrays.asList(
            new Cheese("Gouda", "Gouda is a yellowish Dutch[...]", 1.65),
            new Cheese("Edam", "Edam (Dutch Edammer) is a D[...]", 1.05),
            new Cheese("Maasdam", "Maasdam cheese is a Dutc[...]", 2.35),
            new Cheese("Brie", "Brie is a soft cows' milk c[...]", 3.15),
            new Cheese("Buxton Blue", "Buxton Blue cheese i[...]", 0.99),
            new Cheese("Parmesan", "Parmesan is a grana, a [...]", 1.99),
            new Cheese("Cheddar", "Cheddar cheese is a hard[...]", 2.95),
            new Cheese("Roquefort", "Roquefort is a ewe's-m[...]", 1.67),
            new Cheese("Boursin", "Boursin Cheese is a soft[...]", 1.33),
            new Cheese("Camembert", "Camembert is a soft, c[...]", 1.69),
            new Cheese("Emmental", "Emmental is a yellow, m[...]", 2.39),
            new Cheese("Reblochon", "Reblochon is a French [...]", 2.99));

    private IModel<List<Cheese>> allCheeseListModel;
    private IModel<Cart> cartModel;
    private Cart cart;

    public IndexPage() {
        super();
        allCheeseListModel = new ListModel<Cheese>(cheeses);
        cart=new Cart();
        cartModel = new Model<Cart>(cart);
    }

    public IndexPage(IModel<Cart> cartModel) {
        super();
        allCheeseListModel = new ListModel<Cheese>(cheeses);
        this.cartModel=cartModel;
    }

    @Override
    public Component getMainPanel() {
        System.out.println("getMainPanel started");

        return new ListCheesePanel(MAIN_PANEL_WICKET_ID,allCheeseListModel){

            private static final long serialVersionUID = 1L;

            @Override
            protected void elementClicked(AjaxRequestTarget target,Cheese cheese) {
                Cart cart = cartModel.getObject();
                cart.getCheeses().add(cheese);
                target.add(?????); // How can i get the cart container to update????
            }
        };
    }

    @Override
    public Component getRightMenuPanel() {
        CartPanel cartPanel = new CartPanel(RIGHT_MENU_PANEL_WICKET_ID,cartModel,true) {

            private static final long serialVersionUID = 1L;

            @Override
            protected void removeElement(Cheese cheese) {
                Cart cart = cartModel.getObject(); 
                cart.getCheeses().remove(cheese);
            }
        };
        cartPanel.setOutputMarkupId(true);
        return cartPanel;
    }

}

我的问题是:

如果该组件位于另一个面板中,如何获取该组件的引用以进行更新(因此,我认为示例中为cartContainer,因为我无法将listView组件直接添加到目标中)?

提前致谢

解决方法:

我真正想做的是处理事件.

我定义了这样的全局AjaxUpdateEvent:

AjaxUpdateEvent

public class AjaxUpdateEvent
{
    public AjaxRequestTarget target;

    public AjaxUpdateEvent( AjaxRequestTarget target )
    {
        this.target = target;

    }

    public AjaxRequestTarget getTarget()
    {
        return this.target;
    }

}

然后,我将我感兴趣的事件子类化,例如CheeseAddedEvent扩展了AjaxUpdateEvent

然后,添加奶酪时需要执行某些操作的所有组件都具有onEvent()

OnEvent

@Override
public void onEvent( IEvent<?> event )
{
    Object payload = event.getPayload();

    @SuppressWarnings( "rawtypes" )
    Class clazz = payload.getClass();

    //or use isAssignableFrom() or instanceof or any method you like
    if ( CheeseAddedEvent.class.equals( clazz ) )
    {
        CheeseAddedEvent e = ( (CheeseAddedEvent) payload );
        e.target.add( this );
    }
    super.onEvent(event);
}

用法

....
public void onClick(AjaxRequestTarget target)
{
    this.send( this.getPage(), Broadcast.BREADTH, new CheeseAddedEvent( target ) );
}
....
上一篇:Sql效能优化总结(续)- sql语句优化篇


下一篇:Wxpython pannel切换