f:ajax渲染引用了迭代组件

时间:2019-01-14 11:04:49

标签: jsf myfaces websphere-portal

我的xhtml具有以下结构:

list_ <- list(c(3, 4, 5, 8), c(2, 6, 9, 10), c(1, 7))
library(tidyverse)
imap_dfr(list_,~tibble(.x,.y)) %>% arrange(.x) %>% pull(.y) %>% as.list

# [[1]]
# [1] 3
# 
# [[2]]
# [1] 2
# 
# [[3]]
# [1] 1
# 
# [[4]]
# [1] 1
# 
# [[5]]
# [1] 1
# 
# [[6]]
# [1] 2
# 
# [[7]]
# [1] 3
# 
# [[8]]
# [1] 1
# 
# [[9]]
# [1] 2
# 
# [[10]]
# [1] 2

这是通过Portlet桥在Websphere Portlet中运行的,这意味着我被Myfaces 2.0所困扰。

我面临的问题是我遇到以下错误:

with(
  as.data.frame(do.call(rbind,Map(cbind,a = list_, b =seq_along(list_)))),
  as.list(b[order(a)]))

请注意,我正在尝试引用f:ajax渲染(:frmMain2:sub1:rep1: 0 :panel)中面板的第一次迭代。

如果我引用了其他内容(在迭代部分之外),例如:frmMain2:sub1:rep1,找到了组件,portlet正常工作。

我无法找到如何在render属性中引用某些迭代组件。

在以下帖子中找到了其中在Mojarra较新版本中已解决此问题的帖子,但Myfaces 2.2.7不能解决该问题:How to find out client ID of component for ajax update/render? Cannot find component with expression "foo" referenced from "bar"

那么,有没有办法引用我想在f:ajax中渲染的组件?

1 个答案:

答案 0 :(得分:0)

由于您只想呈现第一个迭代,因此可以创建自定义组件,标签或模板来封装要迭代的组件,以作为解决方法:

<fieldset>
    <legend>vatId</legend>
    <h:panelGroup id="panel">
        <ui:repeat var="item" value="#{someBean.supplies[vatId]}" id="rep2">
            <f:subview id="sub2">
                <h:commandLink id="command">
                    ${item}
                    <f:ajax
                        event="click"
                        render=":frmMain2:sub1:rep1:0:panel">
                    </f:ajax>
                </h:commandLink>
            </f:subview>
        </ui:repeat>
    </h:panelGroup>
</fieldset>

然后,您可以对第一个选项进行硬编码。这是一些示例代码(由于我没有有关您的模型数据的所有信息,因此您肯定需要对它进行调整)

<h:form id="frmMain2">
    <f:subview id="sub1">
        <custom:component id="first" items="#{someBean.supplies[hardcodedFirstKey]}">
            <f:ajax event="click" render="@this" />
        </custom:component>
        <ui:repeat var="vatId" value="#{someBean.suppliesKeys()}" id="rep1">
            <custom:component items="#{someBean.supplies[vatId]}" rendered="#{!key eq hardcodedFirstKey}">
                <f:ajax event="click" render=":frmMain:sub1:first" />
            </custom:component>
        </ui:repeat>
    </f:subview>
</h:form>