如何在复合组件中找到更新/渲染参数?

时间:2011-12-15 04:46:56

标签: jsf-2 primefaces composite-component

我有一个复合组件,当选择一个项目时,它使用ajax来更改多个元素。我也使用Primefaces p:ajax p:commandButton 而不是 f:ajax ,如果这有任何区别。

问题是我无法在组件上找到正确的更新属性,以便整个组件更新。例如,在以下按钮中:

<p:commandButton id="slGoUSA"
         value="USA" 
         rendered="#{cc.USAButtonOn}"
         actionListener="#{cc.doSetUSA}"
         update="???"  />

我已经尝试了以下所有内容,但没有一个能够正常工作:

update="@this"
update="@form"
update="#{cc.clientId}"
update=":#{cc.clientId}"
update="#{cc.clientId}:localID"
update=":#{cc.clientId}:localID"

唯一可行的是:

update="#{cc.attrs.update}"

然后客户端页面传递一些包含复合组件的clientId。但是,我不想强​​制用户在组件调用中包含更新参数。有没有方便的方法呢?


更新

好的,我认为如果我展示完整的测试用例可能会有所帮助。我实现了一个UINamingContainer来支持复合组件,如下所示:

/*
 * Test code
 */
package com.myapp.app.component;

import java.io.Serializable;
import javax.faces.component.FacesComponent;
import javax.faces.component.UINamingContainer;

@FacesComponent(value="qctest")
public class Qctest extends UINamingContainer implements Serializable {

private enum StateKey { Counter }

public Qctest() { }

@Override
public String getFamily() { return "javax.faces.NamingContainer"; }

public Integer getCounter() {
    Integer i = (Integer) getStateHelper().get(StateKey.Counter);
    if (i == null) i = Integer.valueOf(1);
    else i += 1;
    getStateHelper().put(StateKey.Counter, i);
    return i;
}
}

然后cc定义如下所示:               

<!-- INTERFACE -->
<cc:interface componentType="qctest">
</cc:interface>

<!-- IMPLEMENTATION -->
<cc:implementation>

    <h:outputText id="outText" value="Counter is now: #{cc.counter}" />
    <br/>
    <p:commandButton value="Hit Me" update=":#{cc.clientId}" />
    <br/>
    <h:commandButton value="Or Hit Me" >
        <f:ajax render=":#{cc.clientId}"/>
    </h:commandButton>

</cc:implementation>
</html>

这段代码基本上就是OMG我的第一个AJAX页面!应用程序,除了它在复合组件内,而不是具有普通支持bean的常规页面。

两个按钮都没有成功进行更新。 Firebug显示正在发送的XHR,但响应不会更新计数器。 更新呈现的所有不同值都不起作用。在显示的情况下,primefaces按钮似乎什么都不做,在JSF命令按钮的情况下,我得到一个对话框,上面写着:

malformedXML: During update: test2form:xyz not found

在我看来,这是复合组件中最简单的AJAX用法。谁能解释一下可能会发生什么?

1 个答案:

答案 0 :(得分:1)

  

malformedXML:更新期间:test2form:找不到xyz

你是对的,生成的HTML DOM树中没有一个HTML元素具有该ID。复合组件的内容本身并不包含在JavaScript可以访问的一些通用HTML元素中。你基本上需要引入一些容器组件:

<cc:implementation>
    <h:panelGroup id="container">  
        ...
        <h:commandButton value="submit">
            <f:ajax render="container" />
        </h:commandButton>
        ...
        <p:commandButton value="submit" update="container" />
        ...
    </h:panelGroup>
</cc:implementation>

但我仍然想知道为什么@form不适合你。它对我有用。