2012-11-02 90 views
2

我有一個<ui:repeat>迭代通過List<String>並創建一個<p:commandButton><p:lightBox>當前字符串的值。
但是,當我將widgetVar添加到我的<p:lightBox>的屬性時,<p:commandButton>的值始終是上次迭代的字符串。Primefaces燈箱的widgetVar干擾UI:重複

有人可以解釋發生了什麼,(因爲我需要widgetVar)也許指出一個解決方案?

這是我的HTML:

<html xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:p="http://primefaces.org/ui"> 
<h:head /> 
<h:body> 
    <ui:repeat var="thing" value="#{bugBean.things}"> 
     <p:lightBox widgetVar="whatever"> 
      <h:outputLink> 
       <h:outputText value="#{thing}" /> 
      </h:outputLink> 
      <f:facet name="inline"> 
       <h:form> 
         <p:commandButton action="#{bugBean.writeThing(thing)}" 
          value="#{thing}" /> 
       </h:form> 
      </f:facet> 
     </p:lightBox> 
    </ui:repeat> 
</h:body> 
</html> 

這是支持bean:

package huhu.main.managebean; 

import java.io.Serializable; 
import java.util.ArrayList; 
import java.util.List; 

import javax.enterprise.context.SessionScoped; 
import javax.inject.Named; 

@Named 
@SessionScoped 
public class BugBean implements Serializable { 

    private static final long serialVersionUID = 1L; 
    List<String> things = new ArrayList<String>(); 

    public BugBean(){ 
     things.add("First"); 
     things.add("Second"); 
     things.add("Third"); 
    } 

    public void writeThing(String thing){ 
     System.out.println(thing); 
    } 

    public List<String> getThings() { 
     return things; 
    } 

    public void setThings(List<String> things) { 
     this.things = things; 
    } 

} 

回答

6

widgetVar基本上產生窗口作用域JavaScript變量。什麼你有效地現在做在JavaScript方面是:

window['whatever'] = new Widget(lightboxElement1); 
window['whatever'] = new Widget(lightboxElement2); 
window['whatever'] = new Widget(lightboxElement3); 
// ... 

這樣在JS的whatever變量將僅指最後一個。

你應該基本上可以給他們每個一個唯一的名稱,例如通過將迭代指數:

<ui:repeat var="thing" value="#{bugBean.things}" varStatus="iteration"> 
    <p:lightBox widgetVar="whatever#{iteration.index}"> 

這樣,它實際上就變成:

window['whatever0'] = new Widget(lightboxElement1); 
window['whatever1'] = new Widget(lightboxElement2); 
window['whatever2'] = new Widget(lightboxElement3); 
// ... 

這樣你可以參考個人燈箱由whatever0,whatever1,whatever2等組成


無關的具體問題:是不是更容易使用一個燈箱,並在每次點擊更新它的內容呢?

+0

太棒了!感謝您的啓發性答案並質疑我的設計。 ;)當然,只更新一個內容的燈箱會更有效率。我會這樣做。我被打開燈箱的鏈接已經在lightbox標籤內的事實激怒了 - 現在我意識到這不是一個障礙。還有一個問題:我在哪裏可以(重新)閱讀你剛剛就我的問題向我指出的內容? – Lester

+0

不客氣。我只觀察了生成的HTML代碼(我只是通過查看JSF代碼,從頭至尾知道這個特定的情況)。 – BalusC

0

最近我升級到4.0 primefaces時也有類似的問題 - > 5.1

我不得不使用語法:

PF('whatever0') 

由於如何primefaces名widgetvar變化。