h:dataTable 复合组件,cc.attrs.var,IllegalArgumentException
h:dataTable composite component, cc.attrs.var, IllegalArgumentException
我正在尝试创建自己的数据表,就像 primefaces 一样。问题是 cc.attrs.var
在使用时抛出 IllegalArgumentException。所以我想知道如何才能拥有像 Primefaces 这样的 var 属性。
<cc:interface>
<cc:attribute name="value"/>
<cc:attribute name="var"/>
<cc:attribute name="styleClass"/>
</cc:interface>
<cc:implementation>
<div>Previous</div>
<div>Next</div>
<h:dataTable value="#{cc.attrs.value}" var="#{cc.attrs.var}" styleClass="#{cc.attrs.styleClass}">
<ui:insert/>
</h:dataTable>
</cc:implementation>
根据 UIData#setValueExpression()
javadoc,不允许在 var
属性中使用 EL 表达式。
Throws:
IllegalArgumentException - if name is one of id
, parent
, var
, or rowIndex
您最好的选择是创建一个支持组件,您可以在其中手动评估和设置 UIData
组件的 var
属性绑定到 <h:dataTable>
在 postAddToView
事件期间.
<cc:interface componentType="yourTableComposite">
<cc:attribute name="value" />
<cc:attribute name="var" />
</cc:interface>
<cc:implementation>
<f:event type="postAddToView" listener="#{cc.init}" />
<h:dataTable binding="#{cc.table}" value="#{cc.attrs.value}">
<cc:insertChildren />
</h:dataTable>
</cc:implementation>
@FacesComponent("yourTableComposite")
public class YourTableComposite extends UINamingContainer {
private UIData table;
public void init() {
table.setVar((String) getAttributes().get("var"));
}
public UIData getTable() {
return table;
}
public void setTable(UIData table) {
this.table = table;
}
}
请注意,我将 <ui:insert>
固定为 <cc:insertChildren>
。 <ui:insert>
只能用于 <ui:composition>
/<ui:decorate>
.
另请参阅:
- Initialize a composite component based on the provided attributes
- How does the 'binding' attribute work in JSF? When and how should it be used?
我正在尝试创建自己的数据表,就像 primefaces 一样。问题是 cc.attrs.var
在使用时抛出 IllegalArgumentException。所以我想知道如何才能拥有像 Primefaces 这样的 var 属性。
<cc:interface>
<cc:attribute name="value"/>
<cc:attribute name="var"/>
<cc:attribute name="styleClass"/>
</cc:interface>
<cc:implementation>
<div>Previous</div>
<div>Next</div>
<h:dataTable value="#{cc.attrs.value}" var="#{cc.attrs.var}" styleClass="#{cc.attrs.styleClass}">
<ui:insert/>
</h:dataTable>
</cc:implementation>
根据 UIData#setValueExpression()
javadoc,不允许在 var
属性中使用 EL 表达式。
Throws: IllegalArgumentException - if name is one of
id
,parent
,var
, orrowIndex
您最好的选择是创建一个支持组件,您可以在其中手动评估和设置 UIData
组件的 var
属性绑定到 <h:dataTable>
在 postAddToView
事件期间.
<cc:interface componentType="yourTableComposite">
<cc:attribute name="value" />
<cc:attribute name="var" />
</cc:interface>
<cc:implementation>
<f:event type="postAddToView" listener="#{cc.init}" />
<h:dataTable binding="#{cc.table}" value="#{cc.attrs.value}">
<cc:insertChildren />
</h:dataTable>
</cc:implementation>
@FacesComponent("yourTableComposite")
public class YourTableComposite extends UINamingContainer {
private UIData table;
public void init() {
table.setVar((String) getAttributes().get("var"));
}
public UIData getTable() {
return table;
}
public void setTable(UIData table) {
this.table = table;
}
}
请注意,我将 <ui:insert>
固定为 <cc:insertChildren>
。 <ui:insert>
只能用于 <ui:composition>
/<ui:decorate>
.
另请参阅:
- Initialize a composite component based on the provided attributes
- How does the 'binding' attribute work in JSF? When and how should it be used?