【问题标题】:Format PrimeFaces Slider InputText格式化 PrimeFaces 滑块 InputText
【发布时间】:2015-02-12 20:27:07
【问题描述】:

我有一个带有关联 inputText 的 PrimeFaces 滑块。一切正常,除了我找不到格式化 inputText 值的方法。我希望 inputText 以货币格式显示和获取值。

到目前为止我已经尝试过:

  • p:inputText 更改为pe:inputNumber 组件:导致异常,因为无法设置该值(滑块根本不适用于inputNumber);
  • p:slider 目标设置为与p:inputText 具有相同值的h:inputHidden 组件(附加了f:convertNumber):在通过滑块更改值时有效,但在使用inputText 更改值滑块时不起作用不更新(在幕后引发 UpdateModelException);

更新:后来发现第二个选项抛出异常是因为f:convertNumber期望的是数字类型的bean属性,而不是整数。下面显示的两种解决方案都可以解决此问题。

有没有不使用 jQuery 的简单方法?

谢谢!

菲利普

【问题讨论】:

  • 我认为正确的方法是你的第三点。您是否对两个组件使用相同的 bean 属性?
  • 只有 inputText 需要一个 bean 属性,滑块只需要一个 inputText 它将数据写入 AFAIK。
  • 您需要inputText 吗?您可以使用sliderinputHiddendisplay 属性来实现这一点
  • @giaffa86 这是我尝试的第二个选项。我需要一个 inputText ,用户也可以在其中输入值,所以它不是一个有效的选项。
  • 是的,但如果您不需要严格意义上的InputText,您可以使用outputText 来实现这一点,如 Primefaces Showcase 中所示。

标签: jquery jsf primefaces


【解决方案1】:

所以有两种方法可以解决这个问题:

  1. 创建自定义转换器(由@giaffa86 在他的解决方案中起草);
  2. 对 int 属性启用 Number getter 和 setter 并将它们与 inputText 一起使用(更简单,IMO)。

下面的代码展示了如何实现第二个选项。

TestView.java

@ManagedBean(name="testView")
@ViewScoped
public class TestView {

    private int realValue = 500;

    public int getValueAsInt() {
        return this.realValue;
    }

    public Number getValueAsNumber() {
        return (Number)realValue;
    }

    public void setValueAsInt(int value) {
        this.realValue = value;
    }

    public void setValueAsNumber(Number value) {
        this.realValue = value.intValue();
    }

    public void onSlideEnd(SlideEndEvent event) {
        this.realValue = event.getValue();
    }
}

view.xhtml

    <p:inputText id="input" value="#{testView.valueAsNumber}">
        <p:ajax update="slider" />
        <f:convertNumber currencySymbol="$" type="currency"
            integerOnly="true" />
    </p:inputText>

    <h:inputHidden id="hidden" value="#{testView.valueAsInt}" />
    <p:slider id="slider" for="hidden" minValue="0" maxValue="1000" step="10">
        <p:ajax event="slideEnd" listener="#{testView.onSlideEnd}" update="input" />                    
    </p:slider>

这个解决方案,作为第一个选项,也会丢失实时更新,但这在我的场景中没有问题。

【讨论】:

    【解决方案2】:

    我在下面发布了获取自定义 inputText 的最低要求,但您丢失了它的实时更新。

    SliderView.java

    private int number1 = 0;
    private String number2 = String.valueOf(number1);
    
    public int getNumber1() {
    return number1;
    }
    
    public void setNumber1(int number1) {
    this.number1 = number1;
    }
    
    
    
    public String getNumber2() {
    return number2;
    }
    
    public void setNumber2(String number2) {
    this.number2 = number2;
    }
    
    public void converToInt() {
    log.debug(number2);
    //TODO should be improved
    this.number1 = Integer.parseInt(number2);
    }
    
    public void onSlideEnd(SlideEndEvent event) {
    log.debug("current number: " + event.getValue());
    this.number1 = event.getValue();
    this.number2 = String.valueOf(event.getValue());
    
    }
    

    slider.xhtml

    <h:form id="bcr_form_2" styleClass="form">
        <h:panelGrid columns="1" style="margin-bottom: 10px">
            <p:inputMask id="output" value="#{sliderView.number2}">
                <p:ajax event="keyup" listener="#{sliderView.converToInt}" update="@form:txt @form:slider" />
                <f:converter converterId="CurrencyConverter" />
                <pe:keyFilter regEx="/[0-9_]/i" />
            </p:inputMask>
            <h:inputHidden id="txt" value="#{sliderView.number1}" />
            <p:slider id="slider" for="txt" style="width: 200px">
                <p:ajax event="slideEnd" listener="#{sliderView.onSlideEnd}" update="@form:output" />
            </p:slider>
        </h:panelGrid>
    </h:form>
    

    CurrencyConverter.java

    @FacesConverter("CurrencyConverter")
    public class CurrencyConverter implements Converter {
      @Override
      public Object getAsObject(FacesContext context, UIComponent component, String value) {
        return value.replace('€', ' ').trim();
      }
    
      @Override
      public String getAsString(FacesContext context, UIComponent component, Object value) {
        return value.toString() + "€";
      }
    }
    

    很高兴能提供帮助。

    【讨论】:

    • 稍后我会试一试并告诉你。我需要完整的格式,不仅是货币符号,而且我会尝试使用转换器,看看它是否适用于隐藏字段。没有 inputHidden 的输入 + 转换器 + 滑块运行良好。谢了!
    • 我现在正在实现它,但这个实现有一个问题:当更改滑块值时,inputText 将被更新,但相反不是真的,对吧?我的意思是,如果我直接在 inputText 中更新值,滑块将不会自行更新(位置和值),因为它们没有链接。所以,不幸的是,这不是一个可接受的解决方案。
    • 我需要使用 f:convertNumber h:inputText 和 p:slider 进行更多测试。看起来有问题,因为 convertNumber 与数字或浮点数和滑块仅与整数一起使用,因此在使用 f:convertNumber 时我得到了 UpdateModelException。也许自定义转换器可以解决问题,稍后我会深入研究。
    • 您从 inputText 获得了更新滑块的原因。我更新了我的解决方案。
    • 非常感谢您的帮助。我发布了另一个我认为更简单的解决方案,并且避免了在转换器内部处理不同的语言环境格式,所以我认为将其标记为答案会更有帮助。你可以吗?再次,非常感谢你,
    猜你喜欢
    • 2012-12-03
    • 1970-01-01
    • 1970-01-01
    • 2013-10-22
    • 2016-02-15
    • 2013-12-27
    • 2015-05-04
    • 1970-01-01
    • 2012-08-22
    相关资源
    最近更新 更多