4

根据https://code.google.com/p/primefaces/issues/detail?id=4720,该ComponentUtils.resolveWidgetVar(String expression, UIComponent component)功能自 2013 年起在 Primefaces 中可用。它可以通过该"#{p:widgetVarFromContext(searchExpression, component)}"功能在 EL 中使用。

NamingContainer这在多个组件在不同的 id 中具有相同 id但仍存在于同一视图中的情况下很有用。在这种情况下,该#{p:widgetVar(searchExpression)}函数只返回找到的最后一个。

但是我不明白如何引用UIComponent必须作为 EL 的第二个参数传递的那个。上面提到的错误报告建议我们可以使用#{component}. 谁能给我一个例子?

4

2 回答 2

8

#{component}是一个隐式 EL 变量,它引用 EL 范围内的当前UIComponent变量(另请参见隐式 EL 对象)。您通常只能在组件的 HTML 属性或模板文本子项中引用它。

例如,如果<h:inputText>它会引用一个UIInput类的实例,其中包含一个isValid()方法。

<h:inputText id="foo" required="true"
    style="background: #{component.valid ? '' : 'pink'}"
    onclick="alert('Client ID of this component is #{component.clientId}');" />

您还可以使用binding属性让 JSF 在视图构建期间将对 Facelet 范围内的组件实例的引用。这样,组件引用将在视图渲染期间在 Facelet 中的任何位置可用。

<script>alert('Client ID of foo component is #{foo.clientId}');</script>
<h:inputText binding="#{foo}" />

也可以看看:

于 2015-03-13T21:47:37.160 回答
3

引用复合组件内的p:widgetVarFromContextPrimeFaces 小部件时很有用。同一页面上可能有多个组件实例。所以写作是不可能的widgetVar="expression"PF('expression')会有多个同名的小部件。然后最好省略widgetVar属性并使用生成的唯一属性,因为它基于clientId.

您不能#{p:widgetVar('expression')}在您的内部使用,<cc:implementation>因为它会导致Cannot find component for expression "expression" referenced from "j_id1"错误而不是预期的PF('widget_expression').

但是您可以使用#{p:widgetVarFromContext('expression', cc)}which 将返回类似PF('widget_wrapperform_compositecomponent1_expression'). cc指的是复合组件实例的根。

于 2015-05-19T10:25:35.067 回答