ホーム>source

これは私のxhtmlコードです。保存ボタンを使用した後ではなく、フォーカスを失った後、到着時間の入力フィールドを検証する必要があります。どうやってやるの?

<h:outputLabel for="arrivalTime" value="Arrived at: "/>
            <p:outputLabel styleClass="wrapper">
                <p:outputLabel styleClass="centeredButton">
                    <pe:timePicker id="arrivalTime" value="# 
   {timesheetMB.inputTimesheet.arrivalTime}" converterMessage="Invalid time 
    format! Time format should be HH:mm!" mode="popup" intervalMinutes="5" 
    widgetVar="arrivalTimeWidget"  minHour="7" maxHour="13" > 
                        <f:convertDateTime pattern="HH:mm" />
                        <f:validator validatorId="arrivalTimeValidator"/>
                        <p:ajax event="change" listener="# 
   {timesheetMB.onTimeChange}" update="saveButton totalHours workedHours 
    breakTime statusIndicator" />
                    </pe:timePicker>
                </p:outputLabel>
                <p:commandButton id="arrivalNowButton" 
    styleClass="centeredButton" value="Now" actionListener="# 
   {timesheetMB.onArrivalTimeNowButton}" update="arrivalTime saveButton 
    totalHours workedHours breakTime statusIndicator"/>
                <div class="clearfix"></div>
            </p:outputLabel>

そして、これは私のバリデータがどのように見えるかです:

import java.util.Date;
import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.validator.FacesValidator;
import javax.faces.validator.Validator;
import javax.faces.validator.ValidatorException;
import org.hibernate.type.descriptor.java.DataHelper;
import com.infobest.vms.utils.DateHelper;
@FacesValidator("arrivalTimeValidator")
public class ArrivalTimeValidator implements Validator{
    private boolean saveButton = true;
    @Override
    public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
        Date hours = (Date) value;
        DateHelper hour= new DateHelper();
        Date minHour= new Date();
        Date maxHour= new Date();
        minHour.setHours(7); minHour.setMinutes(0);
        maxHour.setHours(13); maxHour.setMinutes(0);
        if( ((hour.getTimeOfDay(hours)).compareTo(hour.getTimeOfDay(minHour))) >= 0 && ((hour.getTimeOfDay(hours)).compareTo(hour.getTimeOfDay(maxHour))) <= 0)
        {
            saveButton = false;
            return;
        }
        else
        {   
            saveButton = true;
            throw new ValidatorException(
                new FacesMessage(
                    FacesMessage.SEVERITY_ERROR, "Arrival time Error",
                    "Please choose an hour between 7 and 12!"));
        }
    }
    public boolean getSaveButtonState() {
        return saveButton;
    }
}

そのsaveButtonStateをxhtmlボタンの無効なタグに送信したいと思います。これは、入力フィールドにフォーカスを失った後、バリデーターが実際に検証することを確認したためです。

あなたの答え
  • 解決した方法 # 1

    時間検証ツールを close に入れます  イベントを無効にし、ボタンを無効にするフラグを設定します。

    したがって、タイムピッカーには次のようなものを配置する必要があります。

    <p:ajax event="close" listener="#{timesheetMB.validateTime}" update="growl"/> 
    
    

    ボタンには次のようなものがあります。

    <p:commandButton id="arrivalNowButton" disabled="#{!(timesheetMB.enabledSave)}"
        styleClass="centeredButton" value="Now" actionListener="# 
       {timesheetMB.onArrivalTimeNowButton}" update="arrivalTime saveButton 
        totalHours workedHours breakTime statusIndicator"/>
    
    

    あなたの豆の中:

    boolean enabledSave = false;
    void validateTime(){
      // validate time
      enabledSave = validate(timeString);
    }
    
    

    動作するはずです。ボタンが無効にならない場合は、 beforeShow を置くことができます  有効な日付を入力するようユーザーに示すイベント。

    お役に立てれば。

  • 解決した方法 # 2

    あなたが持っているものでxhtml すでに動作しているはずのコード。 詳細については、次のリンクを参照してください。 Ajaxの更新を検証します。

  • 前へ java - JPAクエリ:サブクエリをグループ化条件に結合する
  • 次へ excel - セルからのフレーズ、セル参照、および日付を使用して新しいワークブックに名前を付けるVBA