2011-07-30 23 views
5

Tôi có đậu sau ủng hộ:Khi thêm thông báo khuôn mặt vào JSF, hành động của tôi không được thực hiện?

@ViewScoped 
@ManagedBean 
public class WeighFamilyBacking2 implements Serializable { 

private static final long serialVersionUID = 1L; 
private String[] children = new String[] { "Child1", "Child2", "Child3" }; 
private HashMap<String, Integer> newWeights; 

public WeighFamilyBacking2() { 
    newWeights = new HashMap<String, Integer>(); 
    for (String s : getChildren()) 
     newWeights.put(s, new Integer(0)); 
} 

public void distributeWeightsWithoutMessage(ActionEvent event) { 
    for (String s : newWeights.keySet()) { 
     newWeights.put(s, newWeights.get(s) + 1); 
    } 
} 

public void distributeWeights(ActionEvent event) { 
    for (String s : newWeights.keySet()) { 
     newWeights.put(s, newWeights.get(s) + 1); 
    } 

    FacesContext.getCurrentInstance().addMessage(null, 
      new FacesMessage("Succesful", "Weights redistributed.")); 
} 

public HashMap<String, Integer> getNewWeights() { 
    return newWeights; 
} 

public List<String> getChildren() { 
    return Arrays.asList(children); 
} 
} 

... Và trang xhtml sau:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:h="http://java.sun.com/jsf/html"> 
<h:body> 
    <h:form> 
     <ui:repeat var="child" value="#{weighFamilyBacking2.children}"> 
      <h:outputText value="#{child}" /> 
      <h:outputText value="#{weighFamilyBacking2.newWeights[child]}" /> - 
      <h:outputText value="#{weighFamilyBacking2.newWeights[child]}" /> - 
      <h:inputText id="oz" value="#{weighFamilyBacking2.newWeights[child]}" /> 
      <h:inputText id="lbs" 
       value="#{weighFamilyBacking2.newWeights[child]}" /> 
      <br /> 
     </ui:repeat> 

     <h:commandButton 
      actionListener="#{weighFamilyBacking2.distributeWeights}" 
      value="Redistribute" /> 


     <h:commandButton 
      actionListener="#{weighFamilyBacking2.distributeWeightsWithoutMessage}" 
      value="Redistribute Without Message" /> 
    </h:form> 
</h:body> 
</html> 

Đây là một trường hợp thử nghiệm tái sản xuất đơn giản. Khi bạn nhấp vào phân phối lại mà không có thông báo, mọi thứ hoạt động như mong đợi. Khi bạn nhấp vào nút phân phối lại, nó sẽ hiển thị thông báo thành công nhưng các trường nhập không được cập nhật. Tuy nhiên, trường đầu ra văn bản được cập nhật chỉ một lần.

Tôi đã thử sử dụng ngay = true trên cả hai nút và điều đó không ảnh hưởng đến điều này. Đây là một trường hợp rất đơn giản, tôi không thể hiểu tại sao nó không hoạt động.

Tôi đã thử điều này với tất cả các phiên bản gần đây của Mojarra bao gồm 2.1.3.

+0

JSF impl/version gì? Không thể sao chép vấn đề này với Mojarra 2.1.1. – BalusC

+0

Tôi đang sử dụng 2.1.2. Tôi cũng sử dụng richfaces 4 và primefaces cũng nằm trong bản mix. Tôi sẽ cố gắng loại bỏ một số điều đó và xem điều đó có giúp ích gì không. –

+0

Kết quả tương tự chỉ với Mojarra 2.1.2 (FCS 20110610). –

Trả lời

1

Đây là một bất thường khác <ui:repeat>. Tôi chưa biết chính xác nguyên nhân gốc rễ sao cho tôi có thể kiểm tra xem điều này đã được báo cáo cho số JSF guys và nếu cần báo cáo, nhưng tôi có thể nói rằng nó hoạt động khi tôi thay thế <ui:repeat> bởi <h:dataTable>.

<h:dataTable var="child" value="#{weighFamilyBacking2.children}"> 
    <h:column> 
     <h:outputText value="#{child}" /> 
     <h:outputText value="#{weighFamilyBacking2.newWeights[child]}" /> - 
     <h:outputText value="#{weighFamilyBacking2.newWeights[child]}" /> - 
     <h:inputText id="oz" value="#{weighFamilyBacking2.newWeights[child]}" /> 
     <h:inputText id="lbs" 
      value="#{weighFamilyBacking2.newWeights[child]}" /> 
    </h:column> 
</h:dataTable> 

Có thể một số <table> không đúng về mặt ngữ nghĩa cho bạn. Nếu điều này thực sự không thể nhìn thấy, bạn có thể kiểm tra xem nó có hoạt động không có vấn đề với sốcủa Tomahawk, số <rich:dataList> của RichFaces, số <p:dataList> của PrimeFaces, mỗi cái đều hỗ trợ hiển thị các con mà không cần đánh dấu bổ sung.

Cập nhật: Tôi đã báo cáo số này là issue 2157.

+0

Cảm ơn bạn BalusC! Ít nhất tôi biết tôi không điên. Một datatable có khả năng sẽ làm việc tốt ở đây. Hãy cho tôi biết nếu tôi nên mở một cái gì đó với các chàng trai JSF để báo cáo nó. Đó là một khá dễ dàng để tái sản xuất để kiểm tra trường hợp. Thật kỳ lạ là nó chỉ ảnh hưởng đến các yếu tố inputText trong quá trình lặp lại. Tôi nghĩ có lẽ nó có liên quan đến việc xác định các phần tử inputText trong quá trình lặp lại? –

+0

Có, tôi đã có một vấn đề tương tự trước với các hộp kiểm trong một 'ui: repeat' lồng nhau được cập nhật trong khi gọi hành động. Nhưng không có 'FacesMessage' tham gia. Tôi tò mò về nguyên nhân của 'FacesMessage' trong vấn đề phân biệt của bạn. – BalusC

Các vấn đề liên quan