嘗試編寫允許多文本輸入的複合組件。我讀過可以爲複合組件定義一個後備組件,所以我不必編寫渲染器或處理程序。我想不出的是如何將在composite的xhtml中聲明的動作委託給後備組件。我想我還不完全理解這個概念。有人有想法嗎?調用複合組件中的備份組件的ActionListener
我使用Tomcat 7,EL 2.2,春季3,鑽嘴魚科2.1.7
這是我想使用該組件的方式:
<custom:multiInput value="#{backingBean.inputList}"/>
凡BackingBean.java持有對象的列表:
@Component
@Scope(value="view")
public class BackingBean {
...
private List<Foo> inputList;
....
}
的複合元件multiInput.xhtml看起來像THI S:
<cc:interface componentType="MultiInput">
<cc:attribute name="value" required="true" type="java.util.List" />
</cc:interface>
<cc:implementation>
<div id="#{cc.clientId}">
<h:dataTable value="#{cc.attrs.rows}" var="row">
<h:column>
<!-- here will be a selector component in order to select a foo object -->
</h:column>
<h:column>
<h:commandButton value="Remove Row">
<f:ajax execute=":#{cc.clientId}" render=":#{cc.clientId}" listener="#{cc.removeRow(row)}" />
</h:commandButton>
</h:column>
<h:column>
<h:commandButton value="Add Row" rendered="#{cc.lastRow}">
<f:ajax execute=":#{cc.clientId}" render=":#{cc.clientId}" listener="#{cc.addEmptyRow()}" />
</h:commandButton>
</h:column>
</h:dataTable>
</div>
</cc:implementation>
這裏後盾組件MultiInput.java:
@FacesComponent(value="MultiInput")
public class MultiInput extends UIInput implements NamingContainer, Serializable{
...
@Override
public String getFamily() {
return "javax.faces.NamingContainer";
}
@Override
public void encodeBegin(FacesContext context) throws IOException {
initRowsFromValueAttribute();
super.encodeBegin(context);
}
public void removeRow(MultiInputRow row) {
// why is this method is never reached when clicking remove button?
}
public void addEmptyRow() {
// why is this method is never reached when clicking add button?
}
public ListDataModel<MultiSelectRow> getRows() {
return (ListDataModel<MultiSelectRow>) getStateHelper().eval(PropertyKeys.rows, null);
}
private void setRows(ListDataModel<MultiSelectRow> rows) {
getStateHelper().put(PropertyKeys.rows, rows);
}
...
}
現在 - removeRow
和addEmptyRow
從不叫上多輸入。 ajax請求被觸發,但在某處丟失。爲什麼?
是否有一個'上的複合或任何其父母rendered'屬性?如果是這樣,你是否100%在表單提交期間評估'true'?另請參閱http://stackoverflow.com/questions/2118656/hcommandlink-hcommandbutton-is-not-being-invoked在代碼中,您順便提到了一些紅鯡魚。簡化/重命名時請小心。 – BalusC 2012-03-28 19:00:09
thx @BalusC,我更新了樣本,所以它少了'紅鯡魚'(希望)。是的,我驗證了所有父組件的'rendered'屬性都被評估爲'true'。但是讓我想知道的是[stackoverflow.com/questions/2118656/...](http://stackoverflow.com/questions/2118656/hcommandlink-hcommandbutton-is-not-being-invoked)中的第4點。似乎支持組件不被保留。每次我點擊刪除或添加按鈕'CompositeComponentTagHandler.createComponent'會創建一個新的支持組件'MultiInput'的實例。但爲什麼? – fischermatte 2012-03-29 08:30:42
我已經創建了這樣的組件,他們工作正常。我拷貝了你的確切代碼(爲了簡單起見,我只用'Object'替換了'Foo'和'MultiSelectRow'),它工作的很好。您的具體問題是其他地方引起的,到目前爲止沒有在代碼中顯示。也許是嵌套的形式。也許一個'渲染'屬性評估'false'。誰知道。唯一的區別是我不使用Spring,因此只在bean上使用標準的JSF註釋。 – BalusC 2012-03-29 13:26:07