2014-09-24 42 views
5

給定一個SlickGrid,如何觸發所有行中的所有單元進行驗證?或者,也許使用JavaScript觸發一次細胞進行驗證(然後我可以使用所有行中的所有單元格)?驗證SlickGrid所有行中的所有單元

用例是一個地方的用戶必須編輯每一個細胞,並提供默認值以外的東西,我們要確保他們這樣做我們要顯示的默認驗證錯誤的行爲,如果他們沒有。

目前看來驗證只發生在編輯的字段上。

+0

是否使用,你可以委託「工作」的這部分以任何其他框架可以用來風格的失敗?正如你所觀察到的,Slickgrid的默認驗證僅限於'editor'的'validate'函數,該編輯器僅將該值作爲參數傳遞。你可以修改源代碼以獲得所需的行爲,但是我個人會將這種類型的驗證委託給另一個框架(即[Knockout Validation](https://github.com/Knockout-Contrib/Knockout-Validation))...儘管我對這個組合有偏見,因爲我有經驗。 – Origineil 2014-09-29 14:40:36

+0

不,我寧願堅持建立在SlickGrid驗證。 – jlarson 2014-09-29 14:44:39

+0

我已經[開始演示](http://jsfiddle.net/origineil/nLpzjL32/)完整的網格驗證。 「validate」按鈕將針對每個數據條目運行任何定義爲「validator」的列。 *默認驗證錯誤行爲*是不允許關閉編輯器輸入字段,所以我添加了單元格閃爍來說明您需要實現所需的故障處理。其次,我不知道一個* default *值會是什麼,所以我只使用了數字,要求它們是'> 0'。 – Origineil 2014-10-03 16:01:04

回答

2

正如所觀察到的,Slickgrid的默認驗證僅限於editorvalidate函數,該函數檢查任何可用validator僅傳遞值作爲參數。爲了提供額外的上下文信息,需要自定義編輯器,或者更具體地說是自定義驗證功能。

this.validate = function() { 
    if (args.column.validator) { 
     args.newValue = $input.val() 
     var validationResults = args.column.validator(args); 

     if (!validationResults.valid) { 
      return validationResults; 
     } 
    } 

    return { valid: true, msg: null }; 
}; 

每一列隨後將需要在其中默認值將依據它來檢查驗證器無論是從編輯來一個新值,或與任何其他所需的驗證方面沿着現有的值。

var Validator = function(args) { 

    //validate the existing value or the incoming editor value 
    var value = args.newValue ? args.newValue : args.item[args.column.field] 
    var result = value > 0 
    return {valid: result} 
} 

驗證整個網格提供驗證方法,遍歷每行查看每個列的驗證器。基於驗證結果,建立rowIndex -> collection of failures的關係映射以傳遞給本地onValidationError事件。這允許訂閱處理用戶通知存在錯誤。此外,驗證結果可以通過providing specific metadata to the grid

var validateColumns = function(args){ 

var failures=[]; 

for (c in columns) { 
    var column = columns[c] 
    if (column.validator) { 
     if(!column.validator({row: args.row, item: args.item, column: column}).valid){ 
     failures.push({columnIndex: c, column: column, rowIndex: args.row, item: args.item}) 
     } 
    } 
} 
return failures; 
} 

grid.validate = function() { 
    var rowFailures = {} 
    for (r in data) { 
    //ignore our metadata provider (if applicable) 
    if(r == 'getItemMetadata'){continue;} 

    var failures = validateColumns({item: data[r], row: r}) 
    if(failures.length > 0){ 
     rowFailures[r] = failures; 
    } 
    } 

    if(Object.keys(rowFailures).length > 0){ 
    grid.onValidationError.notify({"rowFailures": rowFailures}, new Slick.EventData()) 
    } 
    } 

Fiddle

相關問題