2013-05-07 22 views
0

我的小門應用程序出現了一些問題。Wicket RepeatingView刷新/重新顯示?可能性? [列表項缺失]

問題出在一個名爲OverviewPage的頁面上,這裏有一些面板,像ListPanel,我的RepeatingView是。

這RepeatingView(列表)得到了一些項目與每個項目的按鈕,如果我按下按鈕,我將被重定向到另一個頁面(RegistrationPage),並對RepeatingView(列表)進行了一些更改。

如果我現在使用RepeatingView(列表)導航回OverviewPage,則列表與以前完全相同。我對列表項進行了更改,但它們不可見。 (我沒有按下瀏覽器後退按鈕,我點擊了我的導航鏈接)

我知道wicket頁面會話的最後一個實例。我可以告訴wicket重新呈現此頁面/列表嗎?那裏有什麼可能性?誰可以嗎?

感謝

編輯:

以下是保持RepeatingView面板:

/** 
* 
* Constructor... 
* 
* @param id 
*/ 
public ServiceListPanel(String id) { 

    super(id); 

    RepeatingView repeating = new RepeatingView("repeating"); 
    add(repeating); 

    int index = 0; 

    // add all services to the list 

    for (Service service : databaseService.getAllServices()) { 

     AbstractItem item = new AbstractItem(repeating.newChildId()); 

     repeating.add(item); 

     item.add(new ActionPanel("actions", new Model<Service>(service))); 

     item.add(new Label("name", service.getName())); 
     item.add(new Label("description", service.getDescription())); 
     item.add(new Label("country", service.getCountry())); 

     final int idx = index; 
     item.add(AttributeModifier.replace("class", new AbstractReadOnlyModel<String>() { 

      private static final long serialVersionUID = 1L; 

      @Override 
      public String getObject() { 

       return (idx % 2 == 1) ? "even" : "odd"; 
      } 
     })); 

     index++; 
    } 

} 

下一個是ActionPanel在變化應該發生:

/** 
* 
* Constructor... 
* 
* @param id 
* @param model 
*/ 
public ActionPanel(String id, final IModel<Service> model) { 

    super(id); 

    Link<?> link; 

    ContextImage image; 

    final ServiceUserDetails user = getSession().getUser(); 

    final Service service = model.getObject(); 

    // Check for groups and customize the link to subscribe or unsubscribe 

    if (checkUserGroups(user, service)) { 

     image = new ContextImage("img", "template/img/unsubscribe.gif"); 

     link = new Link<Void>("select") { 

      /** */ 
      private static final long serialVersionUID = -2153508505463870485L; 

      /** 
      * 
      * @see org.apache.wicket.markup.html.link.Link#onClick() 
      */ 
      @Override 
      public void onClick() { 

       ServiceRequest req = new ServiceRequest(service, user, "DELETE"); 

       serviceProcessor.handleServiceRequest(req); 

       setResponsePage(new RegistrationPage()); 



      } 
     }; 

    } else { // user is not in group 

     image = new ContextImage("img", "template/img/subscribe.gif"); 

     link = new Link<Void>("select") { 

      /** */ 
      private static final long serialVersionUID = -2153508505463870485L; 

      /** 
      * 
      * @see org.apache.wicket.markup.html.link.Link#onClick() 
      */ 
      @Override 
      public void onClick() { 

       ServiceRequest req = new ServiceRequest(service, user, "PUT"); 

       serviceProcessor.handleServiceRequest(req); 

       setResponsePage(new RegistrationPage()); 


      } 
     }; 

    } 

    link.add(image); 

    add(link); 

} 

正如你所看到的,我唯一想改變的就是一個圖像,一個鏈接,我法師。用於訂閱或取消訂閱服務。列表項目保持不變。

Iam相當新的檢票口,也許多數民衆贊成我的問題。

現在希望它更好地解釋。

回答

1

現在有效。

這是我的錯誤。該列表可以更新,但不是在我的條件下:

我用SpringSecurity和Wicket組合來實現用戶身份驗證。一個用戶在我的wicketSession中通過ldap進行了認證。 Autentication擁有一個用戶對象,包含我需要的所有東西(名稱,sn,組,電子郵件等)。

在我的RepeatingView中,更確切地說在我的ActionPanel中,我做了一些操作,通過將用戶添加到其他組來修改用戶的LDAP條目。

現在的問題是:保存用戶對象的認證,持有OLD未修改的用戶對象。 (記住:我改變了用戶組。)

這就是爲什麼我沒有看到我的listItems中的任何改變,我的條件很喜歡...

if (user is in group) { 

    addUnSubscribeLink(); 

} else { 

    addSubscribeLink(); 

} 

感謝您的幫助反正。

2

你必須在這裏有所不同。一個頁面/組件的結構被構造一次,並且要求這個樹組件被渲染用於每個頁面顯示(刷新)。一些中繼器在渲染過程之後保留了組件列表,因此無論您如何處理列表(更改其中的元素),它都不會影響呈現的輸出。

其他中繼器(RefreshingView)在渲染併爲每個渲染過程重新創建組件後會放棄所有組件,因此,如果更改了支持列表,這些更改將在渲染輸出中進行摺疊。

此外,沒有任何狀態保持在會話之外。如果會話關閉,則無法返回到舊頁面狀態。

沒有一些代碼,我不能告訴你爲什麼你看到舊的狀態後,你點擊你的後退鏈接。

+0

我在此處添加了一些代碼 – DaUser 2013-05-07 14:07:27

3

爲您的actionPanel提供LoadableDetachableModel而不是正常的Model。 LDM總是獲取新的新對象,所以這可能會解決您的問題。你可能不得不重構你的代碼很多。

上次發生與DataTable類似的問題,它有所幫助。

+0

有關LDM的更多信息,請參閱-https://cwiki.apache.org/WICKET/working-with-wicket-models.html#WorkingwithWicketmodels-DacachableModels – 2013-05-07 21:06:52

1

我幾乎所有的轉發器都使用ListView,因爲它非常簡單。爲了使用ListView,我會替換下面幾行代碼(注意:我跳過了一些行,你可以在原地離開併發生衝突databseService.getAllServices(),這樣你就可以驗證它在那個時候實際更新了):

RepeatingView repeating = new RepeatingView("repeating"); 
for (Service service : databaseService.getAllServices()) { 
    AbstractItem item = new AbstractItem(repeating.newChildId()); 
    repeating.add(item); 
    ... 

有了這個:

List<Service> serviceList = databaseService.getAllServices(); 
ListView repeating = new ListView("repeating", serviceList) { 
    @Override 
    protected void populateItem(ListItem item) { 
     Service service = (Service) item.getModelObject(); 
     ... 

然後,您應該可以使用您的項目&服務變量和以前一樣。此外,在這一點上,你可以看一下,或者用記錄器或調試器來驗證你的databaseService.getAllServices是否返回了正確更新的列表。