我想通過SSJS添加自定義控件,就像我可以添加組件(「組件樹注入」http://openntf.org/XSnippets.nsf/snippet.xsp?id=component-tree-injection) 但我無法獲取它上班。通過SSJS(或以任何其他方式動態添加自定義控件)
我想建立一個網頁,它增加了一個自定義控制每個用戶點擊它的時候在「新人員」按鈕。
首先,我嘗試通過使用repeatControl =「true」的RepeatControl來完成該操作,但這是不可能的,因爲我無法重新加載整個Xpage以創建新的CC並丟失該過程中的所有其他數據。 (見代碼塊)
你應該知道的任何其他可能性,動態地添加自定義的控制,而不重新加載頁面請隨時來解釋。 ;-)
非常感謝!
<xp:button value="New Person" id="newPersonButton">
<xp:eventHandler event="onclick" submit="true" refreshMode="complete">
<xp:this.action>
<![CDATA[#{javascript://
viewScope.counter = viewScope.counter + 1;
}]]>
</xp:this.action>
</xp:eventHandler>
</xp:button>
<xp:repeat id="repeat1" rows="30" repeatControls="true" var="rowData" indexVar="rowIndex">
<xp:this.value><![CDATA[#{javascript:return new Array(Number(viewScope.counter))}]]></xp:this.value>
<xc:ccPersondata id="persondata_${rowIndex}"></xc:ccPersondata>
</xp:repeat>
解決方案:對於最終的解決方案,我從合併塞茲米哈爾的回答(你只讓我很快樂!:))與Dynamically bind an Edit Box in a custom control to a managed bean,並用下面的代碼上來:
的XPage
<xp:repeat id="repeat1" rows="30" var="rowData" indexVar="rowIndex">
<xp:this.value><![CDATA[#{javascript://
var person = function(name,age){
this.name = name;
this.age = age;
}
if(!viewScope.containsKey('list')){
viewScope.list = [];
list.push(new person("victor","24"));
list.push(new person("Igor","24"));
}
return viewScope.list;}]]></xp:this.value>
<xp:panel>
<xc:ccPersondata id="ccPersondata" BindTo="rowData" />
</xp:panel>
</xp:repeat>
<xp:button value="addPerson" id="button1">
<xp:eventHandler event="onclick" submit="true" refreshMode="complete">
<xp:this.action><![CDATA[#{javascript:
var person = function(name,age){
this.name = name;
this.age = age;
}
var emptyPerson = new person('none','0');
viewScope.list.push(emptyPerson);}]]></xp:this.action>
</xp:eventHandler>
</xp:button>
自定義控件:ccPersondata
<xp:label value="Name:" id="label1">
<xp:inputText id="name">
<xp:this.value><![CDATA[${javascript:"#{"+compositeData.BindTo+".name}"}]]></xp:this.value>
</xp:inputText>
</xp:label>
<xp:label value="Age:" id="label2">
<xp:inputText id="age">
<xp:this.value><![CDATA[${javascript:"#{"+compositeData.BindTo+".age}"}]]></xp:this.value>
</xp:inputText>
</xp:label>
真棒,謝謝很多! :) –