我得到一个页面 IndexPage.java ,它基本上由2个面板组成,第一个是 ListCheesePanel.java (它基本上显示了一个有价格的奶酪列表,等等和一个按钮,用于将所选奶酪添加到购物车),第二个是 CartPanel.java ,它本质上是一个购物车,其中包含所有选定的奶酪,您可以继续checkOut。
我基本上会使用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组件)如果此组件位于另一个面板中??
提前致谢
答案 0 :(得分:3)
我会做的,也是非常喜欢的,就是与事件合作。
我定义了一个像这样的全局AjaxUpdateEvent:
public class AjaxUpdateEvent
{
public AjaxRequestTarget target;
public AjaxUpdateEvent( AjaxRequestTarget target )
{
this.target = target;
}
public AjaxRequestTarget getTarget()
{
return this.target;
}
}
然后,我将我感兴趣的事件子类化,例如CheeseAddedEvent extends AjaxUpdateEvent
然后,添加奶酪时需要做的所有组件都有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 ) );
}
....