ajax - ajax调用后复合组件渲染两次

标签 ajax jsf primefaces jsf-2.2 composite-component

我遇到了复合组件的奇怪情况。我在我的 Web 应用程序中使用它,但现在我注意到,如果我更新包含复合组件的表单,该组件会被渲染两次(有时)。

我的组件(假设它名为 datecc)定义如下:

<?xml version="1.0" encoding="UTF-8"?>
<!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:composite="http://java.sun.com/jsf/composite" xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html" xmlns:p="http://primefaces.org/ui">
    <h:body>
        <composite:interface>
            <composite:attribute name="value"/>
            <composite:attribute name="shortFormat"/>
            <composite:attribute name="style"/>
            <composite:attribute name="styleClass"/>
            <composite:attribute default="false" name="inputLabel"/>
        </composite:interface>
        <composite:implementation>
            <span id="#{cc.clientId}">
                <h:outputText rendered="#{not cc.attrs.inputLabel}" style="#{cc.attrs.style}" styleClass="#{cc.attrs.styleClass}" value="#{cc.attrs.value}">
                    <f:convertDateTime pattern="#{cc.attrs.shortFormat ? 'dd/MM/yy' : 'dd/MM/yyyy'}" timeZone="#{timezone}"/>
                </h:outputText>
                <span>asdasdfasdf</span>
                <h:inputText disabled="true" rendered="#{cc.attrs.inputLabel}" style="#{cc.attrs.style}" styleClass="#{cc.attrs.styleClass}" value="#{cc.attrs.value}">
                    <f:convertDateTime pattern="#{cc.attrs.shortFormat ? 'dd/MM/yy' : 'dd/MM/yyyy'}" timeZone="#{timezone}"/>
                </h:inputText>
            </span>
        </composite:implementation>
    </h:body>
</html>

我调用它的页面与此类似:

<h:form id="form">
    <p:dataTable id="rowsTable" value="#{myBean.rows}" var="it" 
            selectionMode="single" selection="#{myBean.selectedRow}" rowKey="#{it.key}"
            rowStyleClass="#{myBean.isRed(it) ? 'red' : null}">
        <p:ajax event="rowSelect" update=":menuForm :detailForm :contextualMenu"/>
        <column>....</column>
        <column><mycc:datecc value="#{it.date}" inputLabel="true" /></column>
    </p:dataTable>
</h:form>

<h:form id="detailForm>
    <!-- this field is rendered twice once I select a row in the above table -->
    <mycc:datecc value="#{myBean.selectedRow.date}" inputLabel="true" />
</h:form>

不幸的是,我在 bean @Named @ConversationScoped public class MyBean { ... } 中对 setSelectedRow 方法做了一些工作,但我不认为这会导致问题。

最佳答案

我通过实现以下类解决了我的问题。

package com.company.faces.cc;

import javax.faces.component.FacesComponent;
import javax.faces.component.NamingContainer;
import javax.faces.component.UIInput;
import javax.faces.component.UINamingContainer;

@FacesComponent("inputDate")
public class Date extends UIInput implements NamingContainer {
    @Override
    public String getFamily() {
        return UINamingContainer.COMPONENT_FAMILY;
    }
}

虽然我真的不知道为什么这可以解决问题,因为它并没有给组件添加太多内容。

关于ajax - ajax调用后复合组件渲染两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33922789/

相关文章:

javascript - 添加 jquery 键盘后,jquery 按钮单击事件不起作用

JSF Facelet 应用程序无法在 jboss AS 7 中工作

jsf - 动态地向素数数据表添加一行

php - HTML 获取 URL 参数

javascript - 如何处理 ajax 中的 php 回显消息。

jsf - 如何更新 <ui : repeat>? 内的按钮

java - 带有嵌入式链接的 JSF 本地化段落

css - p :selectbooleancheckbox is moving when slected in a p:dataTable

javascript - 在 jsf 中使用 d3 图表有技巧吗?

javascript - 如何让 GIF 图像在 AJAX 处理过程中保持移动?