最初渲染的复合组件中的ajax问题= false

时间:2011-02-19 14:30:36

标签: ajax jsf components mojarra

我在复合组件中使用Ajax遇到了问题(而不是 使用clientBehavior属性对自定义组件进行Ajax化。)

我遇到了需要的ajax请求目标的旧问题 在最初呈现页面时呈现在DOM中。

自定义组件具有一些内部ajax交互,但是可以访问 来自最初渲染的div = false,并且ajax通常会停止工作 服务器日志中没有任何错误消息。

这个简单的例子说明了这个问题。如果showPanel属性是 最初设置为true你可以键入一些文本,点击推送链接并查看 屏幕上更新了文字 - 一切都好。如果showPanel设置为false,则表示您 可以点击显示面板但显示“推”链接的切换按钮 更长时间运作。

显然,如果这种复合材料可以作为一种离散的方式,那将是有益的 组件,完全封闭。

有谁知道这有什么办法吗?我花了很多年才写作 所有人都在唱着所有的舞蹈成分,而我第一次尝试使用它时却没有 工作!

感谢。

Mojarra 2.0.4 Glassfish 3.0.1 IE8 / Chrome。

的index.xhtml

<?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:sqcc="http://java.sun.com/jsf/composite/sqcc"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core">
    <h:head>
        <title>Facelet Title</title>
    </h:head>
    <h:body>
        <h:form prependId="false">
            <h:panelGroup id="ajaxTarget">
                <h:panelGroup rendered="#{indexBean.showPanel}">
                    <sqcc:testcomp value="#{indexBean.text}"/>
                </h:panelGroup>
            </h:panelGroup>
            <h:commandButton value="Toggle" action="#{indexBean.togglePanel}">
                <f:ajax render="ajaxTarget"/>
            </h:commandButton>
        </h:form>
    </h:body>
</html>

资源/ SQCC / testcomp.xhtml

<?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:cc="http://java.sun.com/jsf/composite"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core">

    <!-- INTERFACE -->
    <cc:interface>
        <cc:attribute name="value"/>
    </cc:interface>

    <!-- IMPLEMENTATION -->
    <cc:implementation>
        <div id="#{cc.clientId}">
            <h:form prependId="false">
                <h:inputText id="input1" value="#{cc.attrs.value}"/>
                <h:outputText id="output1" value=" #{cc.attrs.value}"/><br/>
                <h:commandLink value="push">
                    <f:ajax execute="input1" render="output1"/>
                </h:commandLink>
            </h:form>
        </div>
    </cc:implementation>
</html>

IndexBean.java

import java.io.Serializable;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

@ManagedBean
@ViewScoped
public class IndexBean implements Serializable {

    public IndexBean() {
    }

    private boolean showPanel = true;
    private String text;

    public String togglePanel() {
        showPanel = !showPanel;
        return null;
    }

    public boolean isShowPanel() {
        return showPanel;
    }

    public void setShowPanel(boolean showPanel) {
        this.showPanel = showPanel;
    }

    public String getText() {
        return text;
    }

    public void setText(String text) {
        this.text = text;
    }
}

[结束]

1 个答案:

答案 0 :(得分:1)

不应该真的回答我自己的问题,但几周之后我又回到了这个问题。 我原来的帖子中的一个大错误是Ajax目标只需要渲染,而不是 必须在第一页加载,众所周知。我一定很累。

我的测试应用程序显示的行为,即“复合材料中的ajax” 如果外部容器最初没有被渲染,那么组件“将无效。” 正确且可重复,但前提是复合组件实现中的逻辑在其自身的形式内。从cc中取出h:表格,一切都是 确定。

布伦丹。