2013-04-17 86 views
10

现状错误JSF 2 ID链接

JavaServer Faces的版本:2.1.6

我得到母体复合部件具有两个嵌套立方厘米。其中一个包含一个HtmlPanelGroup,它有一个组件绑定。我使用该绑定以编程方式将HtmlCommandLink对象添加到HtmlPanelGroup。

让我们把一些标识:

  • 家长父CC
  • CHILD_FIRST第一个孩子CC,嵌套在父母
  • CHILD_SECOND的第二个孩子CC,嵌套在父母
  • GROUP for PanelGroup,嵌套在CHILD_SECOND中
  • LINK_1为第一个HtmlCommandLink对象,编程添加到GROUP

期望

我希望以下ID链接(与默认javax.faces.SEPARATOR_CHAR):

PARENT (Composite Component, declarative) 
    PARENT:CHILD_FIRST (Composite Component, declarative) 
    PARENT:CHILD_SECOND (Component Component, declarative) 
    PARENT:CHILD_SECOND:GROUP (HtmlPanelGroup, declarative) 
     PARENT:CHILD_SECOND:GROUP:LINK_1 (HtmlCommandLink, programmatically) 

问题

的HtmlCommandLink-对象的ID是错误的在第一页访问。代替“父母:CHILD_SECOND:GROUP:LINK_1”,ID仅为“CHILD_SECOND:GROUP:LINK_1”。刷新页面后,ID正确“父母:CHILD_SECOND:GROUP:LINK_1”。实际上,第二个复合组件(“CHILD_SECOND”)中的每个组件都缺少ID(“父项”)的第一部分。刷新后所有ID都正确。

解决方案

我可能会自动在第一次访问后刷新页面。但我不想。

+5

我发现很难理解具体问题,因为'HtmlPanelGroup'不是'NamingContainer'组件,因此不应该将它的ID前置到命令链接子节点。你根本不应该在命令链接儿童的ID中看到“GROUP:”。一个真正的SSCCE将极大地帮助更好地理解具体问题。 – BalusC

+0

为什么地球上这个问题有10个upvotes?问题是目前的形式没有一个有效的SSCCE没有任何意义,因此无法回答。太糟糕了,我无法重新过关近期投票。 – BalusC

+0

@Bluasc我认为你是对的,这很难弄清楚实际的PanelGroup是否包含组件。 – Sheel

回答

-1

由浏览器解释后的id不喜欢你的想法。据我所知它不超过3级。例如:

<h:form id="form"> 
    <h:panel id="panel"> 
     <h:panel id="panel1"> 
      <h:label id="lab"/> 
     </h:panel> 
     <h:panel id="panel2"> 
     </h:panel>  
    </h:panel> 
</h:form> 

然后标签的ID将不会形成:panel:panel1:lab但是form:panel:lab。如果你想获得id的小部件更深,那么我不能说,但它不会超过3个级别。我可以告诉你如何找到身份证。 你可以只写页面,然后在chrome或firefox上查看它,你可以在解释后看到源代码。所以你可以得到你想要的ID。

祝你好运!

+1

为什么地球上这个答案是upvoted?声明*“据我所知,它不超过3级”*是纯粹的废话。相关学习资料:http://stackoverflow.com/questions/8634156/how-to-reference-components-in-jsf-ajax-cannot-find-component-with-identifier/8644762#8644762请注意,''是**不是** NamingContainer。因此,您在''的客户端ID中存在':panel'的语句是另一个纯粹的废话。 – BalusC