2012-03-15 15 views
2

私は私のフィールドに「31/12/2012」と入力した場合、それはフィールドに日付を「2014年7月12日」に変更(日付形式は、MM/DD/YYYYです)。私はむしろそれは "有効ではない"エラーメッセージでエラーが発生します。ExtJSの解析日付が誤っ

私は、以前の開発者からこのコードを継承している

function dateRangeCheck(val, field) { 
    field.vtypeText = ''; 

    var date = field.parseDate(val); 
    if (!date) { 
     field.vtypeText = val + ' is not a valid date - it must be in the format (MM/DD/YYYY).'; 
     return false; 
    } 

    var retVal = true; 

    if (field.fromField) { 
     var fromField = Ext.getCmp(field.fromField); 
     var fromDate = fromField.parseDate(fromField.getValue()); 
     // If we don't have a fromDate to validate with then return true 
     if (!fromDate) 
      return true; 

     retVal = (date >= fromDate); 

     if (retVal) 
      fromField.clearInvalid(); 
    } 
    else if (field.toField) { 
     var toField = Ext.getCmp(field.toField); 
     var toDate = toField.parseDate(toField.getValue()); 
     // If we don't have a toDate to validate with then return true 
     if (!toDate) 
      return true; 

     retVal = (date <= toDate); 

     if (retVal) 
      toField.clearInvalid(); 
    } 

    if (!retVal) { 
     field.vtypeText = 'From Date must be less than or equal to To Date.'; 
    } 
    return retVal; 
} 

私はできるだけ早く私はフィールドに「3」と入力して、デフォルトの「日付範囲」VTYPEを使用しようとすると、それはJSをスローします実行時例外 'オブジェクトはこのプロパティまたはメソッドをサポートしていません'。

+0

ExtJS4をお使いですか? Ext.form.field.Dateコンポーネントを使用していますか? –

+0

わかりません。 ExtJSバージョンで見つかる唯一のリファレンスは3.0 RC 1.1です。 – michaelkoss

+0

バージョンを取得するには、 'Ext.version || Ext.load()を使ってコンソールに「Ext.getVersion()。version'をロードしました –

答えて

1

parseDateへのお電話は、ちょうどstrict switchセットを持っている必要がありますように見えます。 (すなわち ではJavaScript日 "ロールオーバー" を防止)(デフォルトはfalse)を解析中に日付文字列を検証する場合はTrue

strict(オプション)。無効な日付 文字列は解析時にnullを返します。

> Date.parseDate('31/12/2012','m/d/Y') 
    Sat Jul 12 2014 00:00:00 GMT-0500 (Central Daylight Time) 
> Date.parseDate('31/12/2012','m/d/Y', true) 
    null 

のDateFieldでparseDate方法はExtJSの3.xでは、厳密な日付の解析は、任意の実を結ん決してできるようにプライベートと文書化されていない、とdiscussionです。私はあなたの最善の策は、厳密な日付の解析を可能にするためにオーバーライドを使用することだと思います。あなたがグローバルDate.useStrict = trueを設定することができますし、DateFieldには、デフォルトでそれを使用します

// before you use your DateFields 
Ext.override(Ext.form.DateField, { 
    safeParse : function(value, format) { 
     if (Date.formatContainsHourInfo(format)) { 
      // if parse format contains hour information, no DST adjustment is necessary 
      return Date.parseDate(value, format, this.strict); 
     } else { 
      // set time to 12 noon, then clear the time 
      var parsedDate = Date.parseDate(value + ' ' + this.initTime, format + ' ' + this.initTimeFormat, this.strict); 

      if (parsedDate) { 
       return parsedDate.clearTime(); 
      } 
     } 
    } 
}); 

//... and in your DateField config: 
strict: true, 
+0

ext-all-debug.jsにparseDateの定義が見つかりました。ファイルのヘッダーには「Ext JS Library 3.0 RC 1.1」と表示されています。定義は6051行にあります。私はjavascriptでうまくやっていないし、他の関数やプロパティへの参照がたくさんある。私はそれを追跡しようとしています。 – michaelkoss

+0

私は 'Ext.form.DateField'コードを調べましたが、' parseDate'メソッドがあります。それはprivateでドキュメント化されていません。私はあなたがオーバーライドでこれを処理する必要があると思う。私はすぐに私の答えを更新します。 – wes

2

注意。内線用

enter image description here

4+ではなくExt.Date.useStrict = trueだろう。