大家好,我是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 ) );
}
....