私のコード:
<h:form id="newBSTypePanel" >
<h:panelGrid columns="2" id="newRecod" >
<h:outputText value="Name"/><h:inputText value="#{treeTableController.newBStypeBean.currentObject.TYPENAME.value}" required="true" />
<p:commandButton value="save" action="#{treeTableController.saveNewNodes}" oncomplete="Dlg.hide()" update="productDataForm"/>
<p:commandButton value="close" oncomplete="Dlg.hide()" />
</h:panelGrid>
</h:form>
保存アクションに関連する機能はかなりあります。ボタンを繰り返しクリックすると、データベースにいくつかのレコードが保存される場合があります。それは私の願いではありません。複数のクリックを防ぎ、これを解決するにはどうすればよいですか?
_<p:commandButton>
_のクライアント側APIウィジェット:
_PrimeFaces.widget.CommandButton
_
メソッドパラメータの戻り値の型説明
disable()
--voidボタンを無効にしますenable()
--void [有効にする]ボタンしたがって、次のように使用できます。
_<p:commandButton widgetVar="saveButton"
onclick="saveButton.disable()"
value="save"
action="#{treeTableController.saveNewNodes}"
oncomplete="saveButton.enable();Dlg.hide()"
update="productDataForm"/>
_
PrimeFacesの新しいバージョンの場合、解決策は次のようになります。
<p:commandButton widgetVar="saveButton"
onclick="PF('saveButton').disable()"
value="save"
action="#{treeTableController.saveNewNodes}"
oncomplete="PF('saveButton').enable();PF('Dlg').hide()"
update="productDataForm"/>
Javascriptとタイマーを使用する
<script>
function disableClick(){
document.getElementById('saveButton').disables = true;
setTimeout('document.getElementById(\'saveButton\').disables = false', 5000)"
}
</script>
<h:form id="newBSTypePanel" >
<h:panelGrid columns="2" id="newRecod" >
<h:outputText value="Name"/><h:inputText value="#{treeTableController.newBStypeBean.currentObject.TYPENAME.value}" required="true" />
<p:commandButton value="save" action="#{treeTableController.saveNewNodes}" oncomplete="Dlg.hide()" onclick="disableClick()" id="saveButton" update="productDataForm"/>
<p:commandButton value="close" oncomplete="Dlg.hide()" />
</h:panelGrid>
</h:form>
一般的なアプローチとして、ボタンレンダラーをカスタマイズできます。
PrimeFacesにこのレンダラーを使用しますp:commandButton
:
public class CommandButtonSingleClickRenderer extends CommandButtonRenderer {
@Override
public void encodeEnd(FacesContext context, UIComponent component) throws IOException {
CommandButton button = (CommandButton) component;
if (button.isRendered() && !button.isDisabled()) {
button.setOnclick(prefix(button.getOnclick(),
"if(this!==null){disableButton(this.id)}"));
button.setOncomplete(prefix(button.getOncomplete(),
"if(this!==null){enableButton(this.source)}"));
}
super.encodeEnd(context, component);
}
protected String prefix(final String base, final String prefix) {
return base == null ? prefix : prefix + base;
}
}
faces-config.xml:
<render-kit>
<renderer>
<component-family>org.primefaces.component</component-family>
<renderer-type>org.primefaces.component.CommandButtonRenderer</renderer-type>
<renderer-class>com.whatever.CommandButtonSingleClickRenderer</renderer-class>
</renderer>
</render-kit>
JavaScript:
function disableButton(id) {
if (id === null) {
return;
}
var widget = PrimeFaces.getWidgetById(id);
if (widget !== null) {
widget.disable();
}
}
function enableButton(id) {
if (id === null) {
return;
}
var widget = PrimeFaces.getWidgetById(id);
if (widget !== null) {
widget.enable();
}
}