2012-07-25 2 views
0

Ajax를 통해 항목을 삭제 한 후, PropertyListView에서 업데이트하려고하는데 설치가되지 않습니다.Wicket - AjaxLink로 WebMarkupContainer 업데이트

WebMarkupContainer에 PropertyListView를 추가하고이 뷰에 목록을 추가했습니다. 당신은 LoadableDetachableModel를 사용하는

import java.util.ArrayList; 
import java.util.List; 

import org.apache.wicket.ajax.AjaxEventBehavior; 
import org.apache.wicket.ajax.AjaxRequestTarget; 
import org.apache.wicket.ajax.markup.html.AjaxLink; 
import org.apache.wicket.ajax.markup.html.form.AjaxButton; 
import org.apache.wicket.markup.html.WebMarkupContainer; 
import org.apache.wicket.markup.html.basic.Label; 
import org.apache.wicket.markup.html.form.Button; 
import org.apache.wicket.markup.html.list.ListItem; 
import org.apache.wicket.markup.html.list.PropertyListView; 
import org.apache.wicket.markup.html.panel.Panel; 
import org.apache.wicket.model.IModel; 
import org.apache.wicket.model.LoadableDetachableModel; 

@SuppressWarnings("serial") 
public class StockViewPanel extends Panel{ 

    private WebMarkupContainer listContainer; 
    @SuppressWarnings("rawtypes") 
    private PropertyListView plw; 

    @SuppressWarnings({ "rawtypes", "unchecked" }) 
    public StockViewPanel(String id) { 
     super(id); 

     IModel model = new LoadableDetachableModel() { 
      @Override 
      protected Object load() { 
       return WicketApplication.getStockEntrys(); 
      }};  

      plw = new PropertyListView("stockEntrys", model) 
      { 
       @Override 
       protected void populateItem(final ListItem item) 
       { 

        //StockEntry stockEntry = (StockEntry) item.getModelObject(); 
        item.add(new Label("name")); 
        //SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy"); 
        item.add(new Label("date"/*, formatter.format(stockEntry.getDate())*/)); 
        //NumberFormat nf = NumberFormat.getInstance(new Locale("da", "dk")); 
        item.add(new Label("number"/*, nf.format(stockEntry.getNumber())*/)); 
        item.add(new Label("price"/*, nf.format(stockEntry.getPrice())*/)); 
        item.add(new AjaxLink("deleteEntryLink"){ 

         @Override 
         public void onClick(AjaxRequestTarget target) 
         { 
          List list = new ArrayList(WicketApplication.getStockEntrys()); 
          Object ob = item.getModelObject(); 
          list.remove(ob); 
          WicketApplication.setEntrys(list); 
          target.add(listContainer); 
         } 
        }); 
       } 


      }; 
      listContainer = new WebMarkupContainer("listContainer"); 
      listContainer.setOutputMarkupId(true); 
      listContainer.add(plw); 
      add(listContainer); 
    } 
} 

<html> 
<body> 
    <wicket:panel> 
     <table wicket:id="listContainer"> 
      <thead> 
       <th>Navn</th> 
       <th>Dato</th> 
       <th>Antal</th> 
       <th>Pris</th> 
       <th></th> 
      </thead> 
      <tbody> 
       <tr wicket:id="stockEntrys" class="stockEntry"> 
        <td wicket:id="name">name</td> 
        <td wicket:id="date">date</td> 
        <td wicket:id="number">number</td> 
        <td wicket:id="price">price</td> 
        <td> <a href="#" wicket:id="deleteEntryLink">DELETE</a> </td> 
       </tr> 
      </tbody> 
     </table> 
    </wicket:panel> 
</body> 
</html> 
+0

'LoadableDetachableModel' 대신'IModel'을 구현해보십시오. – jordeu

+0

Thx, 효과가있었습니다. –

답변

2

누군가가 도와 드릴까요,이 모델은 RequestCycle에 한 번 load() 메서드를 호출하고 그것의 transient 사본을 유지합니다. WicketApplication.setEntrys(list);으로 항목 목록을 업데이트 할 때 transient 모델 인스턴스를 업데이트하지 않습니다.

LoadableDetachableModel 대신 IModel을 직접 사용하십시오.

0

가을 #detach() 데이터를 변경 한 후 분리형 모델에.

관련 문제