При добавлении сообщения лиц в JSF мои действия не выполняются? - PullRequest
5 голосов
/ 30 июля 2011

У меня есть следующий компонент поддержки:

@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);
}
}

... И следующая страница в формате xhtml:

  <!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>

Это простой воспроизводимый контрольный пример.Когда вы нажимаете на перераспределить без сообщения, все работает как положено.При нажатии на кнопку перераспределения отображается сообщение об успешном завершении, но поля ввода не обновляются.Однако поле для вывода текста обновляется только один раз.

Я попытался использовать немедленное = true на обеих кнопках, и это не влияет на это.Это очень простой случай, я не могу понять, почему это не работает.

Я пробовал это со всеми последними версиями Мохарры, включая 2.1.3.

1 Ответ

1 голос
/ 30 июля 2011

Это еще одна <ui:repeat> аномалия. Я еще не определил точную основную причину, чтобы я мог проверить, сообщили ли они об этом JSF парням , и при необходимости сообщить об этом, но я могу сказать, что это работает, когда я заменяю <ui:repeat> на <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>

Возможно, <table> не является семантически правильным для вас. Если это действительно нежелательно, вы можете проверить, работает ли он без проблем с томагавками <t:dataList>, RichFaces '<rich:dataList>, PrimeFaces' <p:dataList> и т. Д., Каждая из которых поддерживает рендеринг дочерних элементов без дополнительной разметки.

Обновление: Я сообщил об этом как выпуск 2157 .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...