p:带有p的inputText:ajax调用f:viewParam Converter

时间:2018-06-15 12:32:39

标签: jsf primefaces jsf-2.2

我们有一个小页面,它使用viewParam将给定的Id转换为具体对象。在转换inputText字段(模糊)时调用此转换器,该字段经过验证。为什么?我可以重做这个,以便每次都不调用转换器吗?

这很烦人,因为转换器为BackingBean中的相应对象调用set-method,如果第一次调用该页面来创建此对象,则此bean为null。

<f:metadata>
    <f:viewParam name="id" value="#{bean.object}"
                 converter="#{objectConverter}"
                 converterMessage="#{msgs['converter.msg.object']}"/>
    <f:viewAction action="#{bean.init}"/>
</f:metadata>

<p:inputText id="text" value="#{cc.attrs.value}"
             styleClass="inputTextValidated"
             required="#{cc.attrs.required}"
             requiredMessage="#{cc.attrs.requiredmessage}"
             label="text" validatorMessage="#{cc.attrs.msg}" title="#cc.attrs.title}"
             readonly="#{cc.attrs.readOnly}">
            <cc:insertChildren/>
            <p:ajax update="msg_text" event="blur"/>
</p:inputText>
<p>
  <p:message id="msg_text" for="text" display="msg"/>
</p>

如果我们不使用转换器而只使用viewAction将Id转换为相应的对象(或者如果适用则创建新对象),一切都很好。这是解决此问题的唯一/正确解决方案吗?

我们确实使用带有CDI的primefaces 6.1。转换器是一个实现转换器接口的@Named和@ApplicationScoped bean。

在inputtext-field周围使用p:fragment也无济于事。

1 个答案:

答案 0 :(得分:2)

这就是JSF工作原理的本质。如果您不想这样做,建议您检查一下OminFaces ViewParam:http://showcase.omnifaces.org/components/viewParam

从他们的文档中

  

无状态模式,避免不必要的转换,验证和模型   回发更新标准UIViewParameter实现   回发后再次调用模型设置器。这并不总是   绑定到视图作用域的bean时可能需要,并且可能导致   与昂贵的转换器结合使用时会出现性能问题。至   解决此问题,默认情况下,此组件将提交的值存储为   组件属性,而不是模型中的属性(因此处于视图状态)   如果绑定是绑定到视图作用域的bean)。

     

标准的UIViewParameter实现调用转换器并   验证者再次回发。当您不总是这样时   有必填=“ true”,但参数未保留在表单上   提交。您需要在每个命令中保留它   链接/按钮。为了解决这个问题,该组件不会调用   转换者和验证者再次回发。