我有一个用 JSF 2.0 + PrimeFaces 3.4 编写的标签库,现在我正在尝试更新到 JSF 2.2 和 PrimeFaces 4.0。
但我意识到传递给组件的属性值是在复合组件中计算的,这会导致渲染的 id 错误。
enum.xhtml(复合组件)
<cc:interface>
<cc:attribute name="render" default="@this"/>
.....
</cc:interface>
<cc:implementation>
<h:selectOneMenu ......../>
<p:ajax update="#{cc.attrs.render}" process="#{cc.attrs.execute}" />
</cc:implementation>
usage :
<t:enum id="authenticationSource" value="#{authenticationStrategy}" .....
render=":#{cc.clientId}:tabView:passwordVisibility"/>
渲染属性值为:#{cc.clientId}:tabView:passwordVisibility
, 应该
:j_idt1:j_idt3:j_idt5:editorDialog:j_idt39:j_idt40:tabView:passwordVisibility`
但它被评估为
:j_idt1:j_idt3:j_idt5:editorDialog:j_idt39:j_idt40:tabView:autheticationSource:tabView:passwordVisibility
渲染的属性值在复合组件中进行评估,并导致错误。应该在使用它的地方对其进行评估,就像 JSF 2.0 中的那样。
是否有任何配置属性或任何内容可以克服此错误。
我使用的是 Wildfly 8.1.0-Final
这种复合材料的设计不正确。你不应该使用#{cc.clientId}
在复合体的上下文之外。更一般地说,您不应该从复合体外部了解有关复合体内部的任何信息。复合材料本身应该担心这一点。
如果您将复合组件相互嵌套,则此构造将会失败。这#{cc}
然后实际上会引用“当前”复合组件。也许您依赖于旧版 JSF 实现中的一个错误,其中#{cc}
在嵌套复合组件之后,作用域没有被正确清除(即,它将引用最后分配的值,而不是当前上下文中可用的值)。
也许您只是为了错误的目的而过度使用复合组件,并且只是因为与常规标记文件/包含相比的零配置性质。有关何时确切使用其中一种或另一种的详细信息,请前往何时使用 、标记文件、复合组件和/或自定义组件?就这一点而言,仅当您要将一堆密切相关的组件绑定到一个组件时才使用组合组件。singlebean 属性,因此当然不是具有多个属性的“整个”bean。
如果您绝对肯定复合组件是满足您需求的正确解决方案,并且/或者您已相应地重构了复合组件以消除上述误用,那么有 2 种可能的方法可以在复合组件上应用客户端行为,具体取决于具体的功能要求(如果需要,您甚至可以结合这两种方式)。
-
如果你想让复合ajax渲染一个组件outside复合、外化<p:ajax>
(or <f:ajax>
) as <cc:clientBehavior>
:
<cc:interface>
<cc:clientBehavior name="myCustomEventName" targets="idOfTargetComponent" event="valueChange" />
...
</cc:interface>
<cc:implementation>
<h:selectOneMenu id="idOfTargetComponent" ...>
<f:selectItems ... />
</h:selectOneMenu>
</cc:implementation>
哪个将用作:
<t:enum ...>
<p:ajax event="myCustomEventName" update=":absoluteClientIdOfComponentOUTSIDEComposite" />
</t:enum>
<x:someComponent id="idOfComponentOUTSIDEComposite" />
-
如果你想让复合ajax渲染一个组件inside复合体,然后让复合体自己完成这一切。
<cc:interface>
...
</cc:interface>
<cc:implementation>
<h:selectOneMenu ...>
<f:selectItems ... />
<p:ajax update="idOfComponentINSIDEComposite" />
</h:selectOneMenu>
<x:someComponent id="idOfComponentINSIDEComposite" />
</cc:implementation>
并按通常的方式使用它:
<t:enum ... />
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)