2013-04-12 104 views
0

目前我使用[Enter鍵]將記錄保存到網格中,同時保持表單處於打開狀態。我對jqgrid wikiDoc的理解是,clearAfterAdd將清除模式表單中用於輸入下一條記錄的字段,但是此事件不起作用。任何人都可以有所洞察。以下是我的代碼如下。clearAfterAdd事件不起作用

 var lastSel, 
      mydata = [ 
       { id: "1", invdate: "2007-10-01", name: "test", amount: "200.00", tax: "10.00", total: "210.00" } 
      ], 
      grid = $("#list"), 
      getColumnIndex = function (columnName) { 
       var cm = $(this).jqGrid('getGridParam', 'colModel'), i, l = cm.length; 
       for (i = 0; i < l; i++) { 
        if ((cm[i].index || cm[i].name) === columnName) { 
         return i; // return the colModel index 
        } 
       } 
       return -1; 
      }, 
      onclickSubmitLocal = function (options, postdata) { 
       var $this = $(this), grid_p = this.p, 
        idname = grid_p.prmNames.id, 
        grid_id = this.id, 
        id_in_postdata = grid_id + "_id", 
        rowid = postdata[id_in_postdata], 
        addMode = rowid === "_empty", 
        oldValueOfSortColumn, 
        new_id, 
        tr_par_id, 
        colModel = grid_p.colModel, 
        cmName, 
        iCol, 
        cm; 

       // postdata has row id property with another name. we fix it: 
       if (addMode) { 
        // generate new id 
        new_id = $.jgrid.randId(); 
        while ($("#" + new_id).length !== 0) { 
         new_id = $.jgrid.randId(); 
        } 
        postdata[idname] = String(new_id); 
       } else if (typeof postdata[idname] === "undefined") { 
        // set id property only if the property not exist 
        postdata[idname] = rowid; 
       } 
       delete postdata[id_in_postdata]; 

       // prepare postdata for tree grid 
       if (grid_p.treeGrid === true) { 
        if (addMode) { 
         tr_par_id = grid_p.treeGridModel === 'adjacency' ? grid_p.treeReader.parent_id_field : 'parent_id'; 
         postdata[tr_par_id] = grid_p.selrow; 
        } 

        $.each(grid_p.treeReader, function (i) { 
         if (postdata.hasOwnProperty(this)) { 
          delete postdata[this]; 
         } 
        }); 
       } 

       // decode data if there encoded with autoencode 
       if (grid_p.autoencode) { 
        $.each(postdata, function (n, v) { 
         postdata[n] = $.jgrid.htmlDecode(v); // TODO: some columns could be skipped 
        }); 
       } 

       // save old value from the sorted column 
       oldValueOfSortColumn = grid_p.sortname === "" ? undefined : grid.jqGrid('getCell', rowid, grid_p.sortname); 

       // save the data in the grid 
       if (grid_p.treeGrid === true) { 
        if (addMode) { 
         $this.jqGrid("addChildNode", new_id, grid_p.selrow, postdata); 
        } else { 
         $this.jqGrid("setTreeRow", rowid, postdata); 
        } 
       } else { 
        if (addMode) { 
         // we need unformat all date fields before calling of addRowData 
         for (cmName in postdata) { 
          if (postdata.hasOwnProperty(cmName)) { 
           iCol = getColumnIndex.call(this, cmName); 
           if (iCol >= 0) { 
            cm = colModel[iCol]; 
            if (cm && cm.formatter === "date") { 
             postdata[cmName] = $.unformat.date.call(this, postdata[cmName], cm); 
            } 
           } 
          } 
         } 
         $this.jqGrid("addRowData", new_id, postdata, options.addedrow); 
        } else { 
         $this.jqGrid("setRowData", rowid, postdata); 
        } 
       } 

       if ((addMode && options.closeAfterAdd) || (!addMode && options.closeAfterEdit)) { 
        // close the edit/add dialog 
        $.jgrid.hideModal("#editmod" + grid_id, { 
         gb: "#gbox_" + grid_id, 
         jqm: options.jqModal, 
         onClose: options.onClose 
        }); 
       } 

       if (postdata[grid_p.sortname] !== oldValueOfSortColumn) { 
        // if the data are changed in the column by which are currently sorted 
        // we need resort the grid 
        setTimeout(function() { 
         $this.trigger("reloadGrid", [{ current: true }]); 
        }, 100); 
       } 

       // !!! the most important step: skip ajax request to the server 
       options.processing = true; 
       return {}; 
      }, 
      editSettings = { 
       //recreateForm: true, 
       jqModal: false, 
       reloadAfterSubmit: false, 
       closeOnEscape: true, 
       savekey: [true, 13], 
       closeAfterEdit: true, 
       onclickSubmit: onclickSubmitLocal 
      }, 
      addSettings = { 
       recreateForm: true, 
       jqModal: false, 
       reloadAfterSubmit: false, 
       savekey: [true, 13], 
       closeOnEscape: true, 
       closeAfterAdd: false, 
       clearAfterAdd: true, 
       onclickSubmit: onclickSubmitLocal 
      } 
       processing: true 
      } 
      }; 

     grid.jqGrid({ 
      datatype: 'local', 
      data: mydata, 
      colNames: [/*'Inv No', */'Client', 'Amount', 'Tax', 'Total'], 
      colModel: [ 
       //{name: 'id', width: 70, align: 'center', sorttype: 'int', searchoptions: {sopt: ['eq', 'ne']}}, 
       {name: 'name', index: 'name', editable: true, width: 60, editrules: {required: true}}, 
       {name: 'amount', index: 'amount', width: 70, formatter: 'number', editable: true, align: 'right'}, 
       {name: 'tax', index: 'tax', width: 50, formatter: 'number', editable: true, align: 'right'}, 
       {name: 'total', index: 'total', width: 60, formatter: 'number', editable: true, align: 'right'} 
      ], 
      rowNum: 10, 
      rowList: [5, 10, 20], 
      pager: '#pager', 
      gridview: true, 
      rownumbers: true, 
      autoencode: true, 
      ignoreCase: true, 
      sortname: 'invdate', 
      viewrecords: true, 
      sortorder: 'desc', 
      caption: 'How to implement local form editing', 
      height: '100%', 
      editurl: 'clientArray', 
      ondblClickRow: function (rowid, ri, ci) { 
       var $this = $(this), p = this.p; 
       if (p.selrow !== rowid) { 
        // prevent the row from be unselected on double-click 
        // the implementation is for "multiselect:false" which we use, 
        // but one can easy modify the code for "multiselect:true" 
        $this.jqGrid('setSelection', rowid); 
       } 
       $this.jqGrid('editGridRow', rowid, editSettings); 
      }, 
      onSelectRow: function (id) { 
       if (id && id !== lastSel) { 
        // cancel editing of the previous selected row if it was in editing state. 
        // jqGrid hold intern savedRow array inside of jqGrid object, 
        // so it is safe to call restoreRow method with any id parameter 
        // if jqGrid not in editing state 
        if (typeof lastSel !== "undefined") { 
         $(this).jqGrid('restoreRow', lastSel); 
        } 
        lastSel = id; 
       } 
      } 
     }).jqGrid('navGrid', '#pager', {}, editSettings, addSettings, delSettings, 
      {multipleSearch: true, overlay: false, 
       onClose: function (form) { 
        // if we close the search dialog during the datapicker are opened 
        // the datepicker will stay opened. To fix this we have to hide 
        // the div used by datepicker 
        $("div#ui-datepicker-div.ui-datepicker").hide(); 
       }}); 
+0

你不會期望人們挖到這麼多的代碼,是嗎?發佈jsFiddle示例,或縮短代碼。 –

回答

0

您使用我發佈的代碼herehere。我在你的上一個問題的答案中寫過你,如果你使用表單編輯模式,jqGrid不支持編輯本地數據。我發佈的代碼是嘗試實現一種解決方法,它可以使用本地數據的表單編輯功能。 onclickSubmitLocal的代碼是基於editGridRow的事件處理程序complete的代碼編寫的(請參閱here)。如果檢查代碼的the part你會看到,在選項closeAfterAdd: false, clearAfterAdd: true組合內部功能fillData(見the line)將被稱爲

fillData("_empty",$t,frmgr); 

正如我寫的代碼,我將不得不刪除的部分,因爲fillData無法從外部訪問。

您可以執行的操作是使用afterComplete回調函數將輸入表單上的所有字段重置爲默認值。您應該完成的通用代碼是here,但在每個特定情況下,填寫輸入字段會更容易。