无法更新动态创建的组件

时间:2014-01-27 17:08:28

标签: jsf jsf-2 primefaces

使用Primefaces我将用户刚刚点击的组件的id传递给bean。我希望bean改变这个组件的样式。 bean的相关部分:

public void passIdClicked() {

    FacesContext context = FacesContext.getCurrentInstance();
    Map map = context.getExternalContext().getRequestParameterMap();
    String idClicked = (String) map.get("idClicked");

    UIComponent tile = FindComponent.doFind(context, idClicked);

    Iterator<UIComponent> it = tile.getChildren().iterator();

    UIComponent comp = it.next();

    if (comp.getId().equals(idClicked)) {
       HtmlOutputText labelDone = (HtmlOutputText) comp;
       labelDone.setValue("heyyyyyyyyy");
       labelDone.setStyleClass("myStyleClass");
     }
}

修改未出现在屏幕上。我错过了什么?

[编辑] UI代码: (在初始化阶段,动态地在“tiles”panelGroup中创建其他组件.passIdClicked方法修改其中一个组件 - 用户单击的组件。)

<h:head>
</h:head>
<h:body>
    <h:form id="form">
        <h:commandButton actionListener="#{bean.createNewTile()}" title="new" value="new"/>
        <p:remoteCommand name="sendNameClicked" actionListener="#{bean.passIdClicked}"/>
    </h:form>

    <h:panelGroup layout="block" id="tiles">
    </h:panelGroup>

    <script type="text/javascript">
        $(document).ready(function() {
            $('.tile').click(function() {
                sendNameClicked([{
                        name: 'idClicked',
                        value: $(this).attr('id')
                    }]);
            });
        });
    </script>
</h:body>

2 个答案:

答案 0 :(得分:1)

您必须刷新组件,以便进行styleClass更改。

您可以

  • 刷新整个页面。

例如:

<f:ajax render="@all" />

  • 刷新特定组件:

例如:

<p:someComponent id="componentId">
   ....
</p:someComponent>
...
<f:ajax render="componentId" />

答案 1 :(得分:1)

@kocko回答是绝对正确的,但既然您使用的是Primefaces,您也​​可以通过编程方式进行:

RequestContext.getCurrentInstance().update(comp.getClientId());