1

PrimeFaces 6.1。我有一个带有字母的 SelectOneListBox。更改后,将触发 ajax 事件并使用以所选字母开头的单词填充 PickList。如果 PickList 包含单词 XX,则它是有效的,其中 X 是选定的字母。

如果 PickList 有效,则一切正常。如果它失效,一切正常(ajax 被触发,消息被重新呈现等),只有 PickList 在字母更改时不会刷新,除非它再次有效。

有没有办法重新呈现 PickList,即使它无效?

代码:Web.xhtml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE composition 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:h="http://java.sun.com/jsf/html"
    xmlns:p="http://primefaces.org/ui">
<h:head />
<h:body>
    <f:view>
        <h:form>
            <p:selectOneListbox value="#{Web.letter}" required="true">
                <f:selectItems value="#{Web.letters}" var="letter"
                    itemValue="#{letter}" />
                <p:ajax event="change" update="words"
                    listener="#{Web.letterChanged}" />
            </p:selectOneListbox>

            <h:panelGrid columns="2" id="words">
                <p:pickList id="pickList" value="#{Web.words}" var="word"
                    itemLabel="#{word}" itemValue="#{word}"
                    validator="#{Web.validateWords}" showSourceFilter="true"
                    filterMatchMode="startsWith" showTargetControls="true">
                    <p:ajax event="reorder" update="pickListMessages" />
                    <p:ajax event="transfer" update="pickListMessages" />
                </p:pickList>
                <p:message id="pickListMessages" for="pickList" />
            </h:panelGrid>
        </h:form>
    </f:view>
</h:body>
</html>

网络.java:

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.event.AjaxBehaviorEvent;
import javax.faces.validator.ValidatorException;

import org.primefaces.model.DualListModel;

@ManagedBean (name = "Web")
@ViewScoped
@SuppressWarnings (
{ "javadoc", "nls", "unused" })
public class WebBean implements Serializable
{
  private static final long serialVersionUID = 4067529596686991391L;

  private Set<String> letters = new TreeSet<> (Arrays.asList ("A", "B", "C"));

  private String letter = "A";

  private DualListModel<String> words = new DualListModel<> (new ArrayList<> (),
    new ArrayList<> ());

  public Set<String> getLetters ()
  {
    return letters;
  }

  public String getLetter ()
  {
    return letter;
  }

  public void setLetter (String letter)
  {
    this.letter = letter;
  }

  public DualListModel<String> getWords ()
  {
    return words;
  }

  public void setWords (DualListModel<String> words)
  {
    this.words = words;
  }

  private void refreshWordsList ()
  {
    List<String> source = words.getSource ();
    source.clear ();
    source.addAll (Arrays.asList (letter + 'A', letter + 'B', letter + 'C'));
    words.getTarget ().clear ();
  }

  public void letterChanged (AjaxBehaviorEvent ajaxEvent)
  {
    refreshWordsList ();
  }

  public void validateWords (FacesContext ctx, UIComponent component,
    Object value) throws ValidatorException
  {
    @SuppressWarnings ("unchecked")
    DualListModel<String> dualListModel = (DualListModel<String>) value;
    List<String> validatedWords = dualListModel.getTarget ();
    for (String word : validatedWords)
    {
      // OK?
      if (word.charAt (0) == word.charAt (1))
      {
        return;
      }
    }
    throw new ValidatorException (
      new FacesMessage (FacesMessage.SEVERITY_ERROR, "No double", null));
  }
}
4

0 回答 0