2013-10-14 25 views
13

我正在使用一個ExtJs表單,其中有一個文件上傳字段。 在選擇一個文件時,我調用了表單的submit()方法。 但在提交之前,我正在檢查表單是否有效,使用form.isValid()。 現在由於一些未知的原因,我得到form.isValid()爲FALSEExtJs:表單isValid()爲false。但是如何知道表單爲何無效?

但我想知道爲什麼表單驗證失敗? 我保留所有其他領域爲allowBlank: false

有沒有辦法知道(使用方法或配置屬性)爲什麼表單驗證失敗以及表單中的無效字段(以及消息)?

這裏是我的代碼:

var simple = Ext.create('Ext.form.Panel', { 
    id : 'textIntConfigPanel', 
    frame : true, 
    bodyPadding : 1, 
    width : '100%', 
    layout : 'anchor', 
    fileUpload: true, 
    items :[{ 
     xtype : 'panel', 
     layout : 'column', 
     fieldDefaults : { 
      labelAlign : 'center', 
      msgTarget : 'side' 
     }, 
     items : [{ 
      xtype: 'fieldset', 
      columnWidth:0.5, 
      border: false, 
      items:[{ 
       xtype : 'fieldset', 
       title: 'Configuration', 
       flex : 1, 
       defaultType : 'textfield', 
       items : [{ 
        xtype : 'radiogroup', 
        fieldLabel : 'Configuration', 
        id:'rdType', 
        columns : 2, 
        defaults : { 
         name : 'rdType' 
        }, 
        items : [{ 
           inputValue : '0', 
           boxLabel : 'Existing', 
           checked : true 
          },{ 
           inputValue : '1', 
           boxLabel : 'New' 
          }] 
       },{ 
        xtype: 'container', 
        layout: 'hbox', 
        padding: '0 5 0 0', 
        items: [{ 
         xtype: 'textfield', 
         fieldLabel : 'Configuration Name', 
         name : 'txtConfigName', 
         id:'txtConfigName', 
         padding: '0 5 0 0', 
         hidden:true, 
         disabled:true 
        },{ 
         xtype : 'image', 
         padding: '0 5 0 0', 
         hidden:true, 
         id:'nameConfirmation' 
        }] 
       },{ 
        name : 'txtOldConfigTable', 
        id:'txtOldConfigTable', 
        hidden:true 
       },{ 
        xtype : 'combobox', 
        fieldLabel : 'Configuration Name', 
        name : 'cmbConfigName', 
        id:'cmbConfigName', 
        editable:false, 
        valueField : 'configId', 
        displayField : 'configName', 
        emptyText : 'Select Configuration...', 
        store : configNameStore 
       },{ 
         xtype : 'radiogroup', 
         fieldLabel : 'If Data Exists', 
         id:'ifExists', 
         columns : 2, 
         defaults : { 
          name : 'ifExists' 
         }, 
         items : [{ 
            inputValue : 0, 
            boxLabel : 'Update & Insert', 
            checked : true 
           },{ 
            inputValue : 1, 
            boxLabel : 'Insert Only New' 
           }] 
        },{ 
         xtype : 'radiogroup', 
         fieldLabel : 'Location', 
         id:'rdoLoc', 
         columns : 3, 
         defaults : { 
          name : 'rdoLoc' 
         }, 
         items : [{ 
            inputValue : '0', 
            boxLabel : 'Local', 
            checked : true 
           },{ 
            inputValue : '1', 
            boxLabel : 'HTTP' 
           },{ 
            inputValue : '2', 
            boxLabel : 'FTP' 
           }] 
        },{ 
         fieldLabel : 'File Location', 
         name : 'txtFileLoc', 
         disabled:true, 
         hidden:true, 
         id:'txtFileLoc' 
        },{ 
         fieldLabel : 'User Name', 
         name : 'txtUserName', 
         disabled:true, 
         hidden:true, 
         id:'txtUserName' 
        },{ 
         fieldLabel : 'Password', 
         name : 'txtPassword', 
         inputType :'password', 
         disabled:true, 
         hidden:true, 
         id:'txtPassword' 
        }] 
      },{ 
       xtype : 'fieldset', 
       title: 'Scheduling', 
       flex : 1, 
       defaultType : 'textfield', 
       layout : 'vbox', 
       items:[{ 
        xtype : 'fieldset', 
        flex : 1, 
        border:false, 
        padding :0, 
        margin:0, 
        defaultType : 'textfield', 
        width : '100%', 
        layout : 'hbox', 
        items:[{ 
         xtype : 'fieldset', 
         flex : 1, 
         border:false, 
         padding :0, 
         margin:0, 
         defaultType : 'textfield', 
         width : 50, 
         layout : 'anchor', 
         items:[{ 
          xtype : 'combobox', 
          fieldLabel : 'Repeat Type', 
          name : 'cmbRptType', 
          id:'cmbRptType', 
          editable:false, 
          labelWidth : 90, 
          width : 180, 
          store:[['0','Never'],['1','Hourly'],['2','Daily'],['1','Monthly']], 
          displayField: 'val', 
          valueField: 'key', 
          emptyText : 'Select RepeatType...' 
         },{ 
          xtype : 'textfield', 
          fieldLabel : 'Repeat Interval', 
          name : 'txtRptInc', 
          labelWidth : 90, 
          width : 150, 
          id:'txtRptInc', 
          regex: /^[1]?[0-9]{0,1}$/, 
          regexText: "<b>Error</b></br>Increment Must be Integer" 
         }] 
        },{ 
         xtype : 'fieldset', 
         border:false, 
         padding :'0 0 8 0', 
         margin:0, 
         flex : 1, 
         defaultType : 'textfield', 
         width : 20, 
         layout : 'anchor', 
         defaults : { 
          anchor : '100%', 
          hideEmptyLabel : false 
         }, 
         items:[Ext.create('Ext.ux.form.DateTimeField', { 
          xtype : 'textfield', 
          name : 'exeStartDateTime', 
          id : 'exeDateTime', 
          labelWidth : 100, 
          width : 35, 
          fieldLabel : 'Start Date Time' 
         }) 
         ,Ext.create('Ext.ux.form.DateTimeField', { 
          xtype : 'textfield', 
          name : 'exeEndDateTime', 
          id : 'exeEndDateTime', 
          labelWidth : 100, 
          width : 35, 
          fieldLabel : 'End Date Time' 
         })] 
        }] 
       }] 
      }] 
     },{ 
      xtype : 'fieldset', 
      title: 'Data Preparation', 
      flex : 1, 
      defaultType : 'textfield', 
      columnWidth: 0.5, 
      width : '100%', 
      layout : 'vbox', 
      items:[{ 
       xtype : 'fieldset', 
       flex : 1, 
       border:false, 
       padding :0, 
       margin:0, 
       defaultType : 'textfield', 
       width : '100%', 
       layout : 'hbox', 
       items:[{ 
        xtype : 'fieldset', 
        flex : 1, 
        border:false, 
        padding :0, 
        margin:0, 
        defaultType : 'textfield', 
        layout : 'anchor', 
        items:[{ 
         fieldLabel : 'File Name Pattern', 
         name : 'txtfileNamePatern', 
         id:'txtfileNamePatern', 
         value: '*.*' 
        },{ 
         xtype: 'container', 
         layout: 'hbox', 
         items: [{ 
          xtype: 'filefield', 
          name : 'fileUploadBox', 
          id:'fileUpload', 
          vtype : 'file', 
          width: 250, 
          fieldLabel : 'Upload File', 
          buttonText: 'Browse', 
          listeners : { 
           change : function(s, v, o) { 
            fileName = v; 
            var form = this.up('form'); 
            debugger; 
            form.submit({ 
             url : 'textFileIntegrationConfig_!readFile?fileName=' + fileName, 
             data : { 
              fileName : fileName 
             }, 
             success : function(fp, o) { 
              debugger; 
              var response = JSON.parse(o.response.responseText); 
             }, 
             failure : function(fp, o) { 
              debugger; 
              var response = JSON.parse(o.response.responseText);            
             } 
            }); 
           } 
          } 
         },{ 
          xtype : 'image', 
          hidden:true, 
          id:'uploadConfirmation' 
         }]      
        }] 
       },{ 
        xtype : 'fieldset', 
        border:false, 
        padding :'0 0 8 0', 
        margin:0, 
        flex : 1, 
        defaultType : 'textfield', 
        width : 300, 
        layout : 'anchor', 
        defaults : { 
         anchor : '100%', 
         hideEmptyLabel : false 
        }, 
        items:[{ 
         xtype: 'container', 
         layout: 'hbox', 
         items: [{ 
          xtype : 'combobox', 
          fieldLabel : 'Data Delimiter', 
          name : 'cmbFieldDelim', 
          id:'cmbFieldDelim', 
          margin: '5 5 5 0', 
          editable:false, 
          width: 200, 
          store:[["\\t",'Tab'],["\\n",'New Line'],['99','Other']], 
          displayField: 'val', 
          valueField: 'key' 
         },{ 
          xtype: 'textfield', 
          name : 'txtFieldDelim', 
          id : 'txtFieldDelim', 
          enforceMaxLength: false, 
          hidden: true, 
          margin: '5 0 0 0', 
          maxLength: 2, 
          width: 50, 
          validateOnChange : true, 
          validator: function(v) { 
           var txtFieldDelim = Ext.ComponentQuery.query("textfield[name='txtRecordDelim']")[0]; 
           if (v == txtFieldDelim.value) { 
            return "Both Delimiter can't be same"; 
           } 
           return true; 
          } 
         }]      
        },{ 
         xtype: 'container', 
         layout: 'hbox', 
         items: [{ 
          xtype : 'combobox', 
          fieldLabel : 'Row Delimiter', 
          name : 'cmbRecordDelim', 
          id:'cmbRecordDelim', 
          editable:false, 
          margin: '0 5 5 0', 
          width: 200, 
          store:[['\\r','Tab'],['\\n','New Line'],['99','Other']], 
          displayField: 'val', 
          valueField: 'key' 
         },{ 
          xtype: 'textfield', 
          name : 'txtRecordDelim', 
          id : 'txtRecordDelim', 
          enforceMaxLength: false, 
          hidden: true, 
          maxLength: 2, 
          width: 50, 
          validateOnChange : true, 
          validator: function(v) { 
           var txtFieldDelim=Ext.ComponentQuery.query("textfield[name='txtFieldDelim']")[0]; 
           if(v==txtFieldDelim.value){ 
            return "Both Delimiter can't be same"; 
           } 
           return true; 
          } 
         }]      
        }] 
       }] 
      },{ 
       xtype : 'gridpanel', 
       flex : 1, 
       autoSync:false, 
       autoScroll:true, 
       id: 'configGrid', 
       width : '100%', 
       height:180, 
       columns: [{ 
        xtype: 'gridcolumn', 
        flex: 0.33, 
        text: 'File Header Name', 
        sortable: false, 
        menuDisabled: true, 
        dataIndex: 'header'      
       },{ 
        text: 'Field Type', 
        flex: 0.33, 
        menuDisabled: true, 
        dataIndex: 'dataType' 
       },{ 
        text: 'Table Field Name', 
        flex: 0.33, 
        menuDisabled: true, 
        dataIndex: 'finalFieldName', 
        editor: 'textfield' 
       }], 
       store : gridStore, 
       plugins: [Ext.create('Ext.grid.plugin.CellEditing', { 
        clicksToEdit: 1 
       })] 
      }]   
     }], 
     tbar: ['->', { 
      text : 'Save', 
      icon: "images/icon-save.gif", 
      handler : function() { 
       var form=this.up('form'); 
       formAllowBlank(false); 
       if (form.getForm().isValid()) { 
        Ext.MessageBox.show({ 
         msg : 'Saving data, please wait...', 
         progressText : 'Saving...', 
         width : 300, 
         wait : true, 
         waitConfig : { 
          interval : 200 
         } 
        }); 
        saveData(form); 
       } 

      } 
     },{ 
      text : 'Test & Run Now', 
      id: 'Integration.TestBtn', 
      icon: "images/run.png", 
      handler : function() { 
       var form=this.up('form'); 
       TestData(form);      
      } 
     }, { 
      text : 'Reset', 
      icon: "images/cross.png", 
      handler : function() { 
       resetData(); 
      } 
     } ]   
    }] 
}); 

回答

25

您可以嘗試添加以下功能到您的表單面板的定義:

getInvalidFields: function() { 
    var invalidFields = []; 
    Ext.suspendLayouts(); 
    this.form.getFields().filterBy(function(field) { 
     if (field.validate()) return; 
     invalidFields.push(field); 
    }); 
    Ext.resumeLayouts(true); 
    return invalidFields; 
} 

它將返回只包含這些字段的數組,被評價爲無效,here is a working example

+0

這工作!非常感謝!! – DarkKnightFan

+0

真是一種珍貴的功能。謝謝 – Medioman92

32

這裏有一個更簡單的解決方案:

form.query("field{isValid()==false}") 
+2

不錯的解決方案,幫助我!它是Ext.form.action.Submit的一個屬性 – antohoho

相關問題