2013-05-02 77 views
0

以下是我在jqGrid中使用的示例刪除選項。它工作得很好,我的服務器端腳本工作正常。記錄被刪除,但收到服務器的響應後會出現問題。刪除錯誤後的jqGrid

// Del Options 
{ 
    mtype: "POST", 
    modal: true, 
    url: "/internal/backupmanagement/backupmanager/deleteMySQLDB", 
    reloadAfterSubmit: false, 
    onclickSubmit: function() { 
     var post = $("#grid_" + o.id).jqGrid("getGridParam", "postData"); 
     var server = post.serverID; 
     $.openDialog("load", "Deleting old database entry. Please wait..."); 
     var selrow = $("#grid_" + o.id).jqGrid("getGridParam", "selrow"); 
     var row = $("#grid_" + o.id).jqGrid("getRowData", selrow); 
     console.log("about to return", row, server); 
     return { 
      id: row.recid, 
      database: row.database, 
      server: server 
     }; 
    }, 
    afterSubmit: function (response, postdata) { 
     response = eval("(" + response.responseText + ")"); 
     console.log(response); 
     return [true, "success"]; 
    }, 
    afterComplete: function (response, postdata, formid) { 
     response = eval("(" + response.responseText + ")"); 
     var selrow = $("#grid_" + o.id).jqGrid("getGridParam", "selrow"); 
     $("#grid_" + o.id).jqGrid("delRowData", selrow); 
     if (response.error == 0) { 
      $.openDialog("info", "Successfully deleted " + postdata.database + "."); 
     } else { 
      $.openDialog("info", "And error occured - " + response.msg + "."); 
     } 
    } 
} 

我收到以下錯誤之前在網格中被激發的afterComplete事件:

Uncaught TypeError: Object [object Array] has no method 'split'

如此看來事情正在返回一個對象時,它期待的字符串。我不確定我的服務器響應格式是否正確,我也無法在文檔中找到任何預期的響應。

*更新* 請求的服務器端代碼。我剛剛添加了與jqGrid交互的控制器函數,其餘的工作正在進行,並在應用程序中進一步發生。

function deleteMySQLDB() 
{ 
    if (IS_AJAX) { 
    if (($this->Application->deleteMySQLDBData(
     $_POST["id"], 
     $_POST["database"], 
     $_POST["server"] 
    )) === false) { 
     echo json_encode(
      array(
      "error" => 1, 
      "msg" => "Failed Deleting record from database: " 
         .$this->Application->error 
     ) 
    ); 
     return false; 
    } 
    echo json_encode(
     array(
      "error" => 0, 
      "msg" => "success" 
     ) 
    ); 
    return true; 
    } else { 
    header("Location: /"); 
    } 
} 

我希望這有助於看到我目前正在返回到電網。

* UPDATE * 我所做的更改源在jqGrid的插件包括價值一個toString()預成型分裂之前。

在jquery.jqGrid.min.4.3.1的331行:

變種A = []; A = H.split( 「」);

更改爲:

變種A = []; A = H.toString()分割( 「」);

這似乎是在事物的宏觀計劃中無害的變化,並避免陣列試圖分裂。非常感謝幫助的人。你當然指出我在正確的地方開始尋找,奧列格!

+1

不是說它會解決你的問題,而是'response = eval(「(」+ response.responseText +「)」);'(如果你期待一個對象文字),試試'response = JSON。解析(response.responseText);'。甚至是'.parseJSON()'。但這取決於你期望的迴應 – Ian 2013-05-02 15:53:07

+0

非常感謝Ian,我已經這麼做了,我還沒有遇到過那個jQuery功能:) – PieterLourens 2013-05-03 07:15:38

回答

0

讓我們假設描述錯誤的來源是你afterComplete調用的代碼背部。我認爲你用錯了方式。我不明白代碼的某些部分,部分(response.error的測試)應該移動到afterSubmit

如果您檢查the lines的代碼,其中afterComplete回調將被調用,主要問題將很明顯。它將在延遲0.5秒內在setTimeout內執行。當時可以加載網格中的新數據(或者可以加載)。所以使用delRowData等方法會出錯,現在可以更改selrow的值。

我強烈建議你另外不要使用eval函數。相反,線

response = eval("(" + response.responseText + ")"); 

的將是正確使用

response = $.parseJSON(response.responseText); 

onclickSubmit回調的代碼可以改進,如果你會用事實this內回調的(像其他大多數回調o jqGrid)被初始化爲網格的DOM元素。因此,要獲得電網的selrow選項,您可以使用

var selrow = $(this).jqGrid("getGridParam", "selrow"); 

代替

var selrow = $("#grid_" + o.id).jqGrid("getGridParam", "selrow"); 

另一個事實是onclickSubmit將被稱爲的jqGrid有兩個參數:optionspostdata。參數postdata是rowid,如果您使用不使用multiselect: true。在使用multiselect: true的情況下,回調參數postdata的值可以是逗號分隔的將被刪除的行的rowid列表。所以postdata的使用效果與selrow的使用效果相同。

+0

非常感謝奧列格的迴應。我已經對您推薦的代碼進行了更改,除了selrow使用「this」之外,因爲jqGrid在小部件上下文中用於此處。 – PieterLourens 2013-05-03 06:35:22

+0

另外,我在afterComplete回調的第一行使用了控制檯日誌,代碼執行永遠不會達到它。所以在afterSubmit回調之後和afterComplete之前遇到錯誤。 非常感謝! – PieterLourens 2013-05-03 06:51:13

+0

@Lemon:我不是PHP開發人員,但使用[header](http://php.net/manual/en/function.header.php)或[http_response_code](http://php.net/manual/ en/function.http-response-code.php)你可以從服務器返回錯誤。在'errorTextFormat'回調代替'afterSubmit'的情況下將被執行。這是jqGrid處理錯誤的標準方式。獨立於「小部件上下文」'this'將是像'afterComplete'這樣的回調中的網格DOM。所以你不需要用'$(「#grid_」+ o.id)''通過id查找元素**,你可以用'$(this)'得到它。 – Oleg 2013-05-03 08:55:21

0

我「米做很好的猜測,因爲你不包括你的服務器端代碼

上,您可以返回類似服務器:

return Json(new { success = false, showMessage = true, message = "Error - You can't have a negative value", title = "Error" }); 

然後在客戶機上,你可以擁有的東西顯示消息(在這個例子中,如果有一個錯誤)

afterComplete: function (response) { 
         var DialogVars = $.parseJSON(response.responseText); //parse the string that was returned in responseText into an object 

         if (!DialogVars.success || DialogVars.showMessage) { 
          showDialog($('#Dialog'), DialogVars.message, DialogVars.title); 
         } 
        } //afterComplete 
+0

我已經添加了服務器腳本來幫助你診斷問題。這是我一直在尋找的,因爲我懷疑它必須處理服務器響應以某種方式處於不正確的格式。雖然我不確定。 – PieterLourens 2013-05-03 07:17:31