2012-03-13 19 views
5

पर कॉलिंग सॉर्ट स्लिक्ग्रिड में मैं grid.SetSortColumn(colName,true/false) का उपयोग करके सॉर्ट कॉलम और इसकी तरह की दिशा सेट करने में सक्षम हूं। यह केवल सॉर्टिंग ग्लाइफ सेट करता है लेकिन कोई सॉर्टिंग नहीं करता है। सॉर्ट इवेंट हैंडलर को कॉल करने का कोई तरीका है। मैंने सॉर्ट हैंडलर को grid.onSort.subscribe(function(){});slickgrid

उत्तर

0

शायद it आपकी मदद करेगा। ऐसा लगता है कि SlickGrid स्वयं को सॉर्ट कर रहा है - इसलिए यदि आप चाहें तो इसे मैन्युअल रूप से ट्रिगर कर सकते हैं।

10

जो व्यवहार आप देख रहे हैं वह सही है।

grid.setSortColumn(columnId, isAsc); 

केवल कॉलम कॉलम पर ग्लिफ़ अपडेट करता है। आपके मामले में, आपको प्रारंभ में डेटा को सॉर्ट करने की आवश्यकता होगी, और फिर sortColumn पर ग्लाइफ को अपडेट करने के लिए setSortColumn का उपयोग करें। आप इस तरह के सॉर्ट इवेंट में इस्तेमाल किए गए सॉर्टर का पुन: उपयोग कर सकते हैं:

var gridSorter = function(columnField, isAsc, grid, gridData) { 
     var sign = isAsc ? 1 : -1; 
     var field = columnField 
     gridData.sort(function (dataRow1, dataRow2) { 
       var value1 = dataRow1[field], value2 = dataRow2[field]; 
       var result = (value1 == value2) ? 0 : 
         ((value1 > value2 ? 1 : -1)) * sign; 
       return result; 
     }); 
     grid.invalidate(); 
     grid.render(); 
    } 
    var grid = new Slick.Grid($gridContainer, gridData, gridColumns, gridOptions); 

    //These 2 lines will sort you data & update glyph while loading grid  
    //columnField is field of column you want to sort initially, isAsc - true/false 
    gridSorter(columnField, isAsc, grid, gridData); 

    //I had the columnField, columnId same else used columnId below 
    grid.setSortColumn(columnField, isAsc); 

    grid.onSort.subscribe(function(e, args) { 
     gridSorter(args.sortCol.field, args.sortAsc, grid, gridData); 
    }); 

मैं इस समाधान पर कैसे पहुंचे?

यहां टिप्पणियां पढ़ें। https://github.com/mleibman/SlickGrid/issues/325

3

dataView.fastSort नौकरी करता है। आप सॉर्टिंग ग्लाइफ सेट करने के लिए setSortColumn का उपयोग कर सकते हैं।

3

मेरे पास एकाधिक कॉलम सॉर्ट सक्षम हैं, मुझे सही सॉर्ट कॉलम पास करने के लिए फ़ंक्शन को बदलना पड़ा।

grid.onSort.subscribe(function(e, args) { 
    gridSorter(**args.sortCols[0].sortCol.field**, **args.sortCols[0].sortAsc**, grid, gridData); 
}); 
1

मैं Mr.Hunts से प्रेरित था, लेकिन मैं जवाब देने के grid.setInitialSortColumn(columnId, isAsc) करने के लिए वर्तमान grid.setSortColumn(columnId, isAsc) विस्तार करने के लिए एक अलग दृष्टिकोण लिया। यह सॉर्ट लागू करेगा और सब कुछ grid.setSortColumn करता है।

var thisGrid = { //Your grid obj 
     columns: , // Your columns object 
     grid: , // new Slick.Grid.... 
    } 



    thisGrid.grid.onSort.subscribe(function (e, args) { // ar var cols = args.sortCols;] 
      thisGrid.grid.customSort(args); 
     }); 

    thisGrid.grid.customSort = function (args) { 
     var cols = args.sortCols; 
     thisGrid.dataView.sort(function (dataRow1, dataRow2) { 
       if (cols) { 
        for (var i = 0, l = cols.length; i < l; i++) { 
         var field = cols[i].sortCol.field; 
         var sign = cols[i].sortAsc ? 1 : -1; 
         var value1 = dataRow1[field], 
          value2 = dataRow2[field]; 
         var result = (value1 == value2 ? 0 : (value1 > value2 ? 1 : -1)) * sign; 
         if (result != 0) { 
          return result; 
         } 
        } 
       } 
       return 0; 
      }); 
    } 
    thisGrid.grid.setInitialSortColumn = function (columnId, ascending) { 
     thisGrid.grid.setInitialSortColumns([{ 
        columnId: columnId, 
        sortAsc: ascending 
       } 
      ]); 
    }; 
    thisGrid.grid.setInitialSortColumns = function (cols) { 
     sortColumns = cols; 
     $.each(sortColumns, function (i, col) { 
       var columnIndex = thisGrid.grid.getColumnIndex(col.columnId); 
       var column = thisGrid.columns[columnIndex]; 
       if (col.sortAsc == null) { 
        col.sortAsc = true; 
       } 
       var args = { 
        grid: thisGrid.grid, 
        multiColumnSort: true, 
        sortCols: [{ 
          sortCol: column, 
          sortAsc: col.sortAsc 
         } 
        ] 
       } 
       thisGrid.grid.setSortColumn(col.columnId, col.sortAsc); 
       thisGrid.grid.customSort(args); 

      }); 
    }; 

    // Trigger 
    thisGrid.grid.setInitialSortColumn("dateDue", true); 
+0

कॉल करके बस एक भयानक गड़बड़ ... हालांकि यह काम करने के लिए प्रोग्रामेटिक सॉर्टिंग प्राप्त करने का सबसे विश्वसनीय तरीका है। –

2

आप स्तंभ शीर्ष पर क्लिक करें घटना ... जो

छँटाई करता है मैं इस तरह समस्या का समाधान हो ...

$('.slick-header-columns').children().eq(0).trigger('click'); // for first column 
0

ट्रिगर कर सकते हैं मैं एकाधिक छंटाई का उपयोग कर रहा है, और ग्रिड शुरू करते समय सहेजे गए सॉर्ट डेटा को लोड करना।

जैसी उम्मीद थी, setSortColumns छंटाई निर्धारित करते हैं, लेकिन did not वास्तव में यह लागू होते हैं, और dataView.reSort() या .fastSort() फ्लॉप मदद करने के लिए, लदान में किस बिंदु मैं उन्हें कुछ कहा (मैं याद किया गया होगा की परवाह किए बिना लगते हैं , लेकिन यह काम करने के लिए इसे प्राप्त नहीं कर सका)।

अंत में, यह मेरे लिए काम किया। मैं अपने डेटा को पॉप्युलेट करने के तुरंत बाद इसे एजेक्स कॉल से देखता हूं। शायद यह सबसे हल्का नहीं है, बोर्ड पर फीडबैक लेने में बहुत खुश!

function forceResort() { 

    var sortColumns = grid.getSortColumns(); 
    var cols = []; 
    $.each(sortColumns, function(index, value) { 
     var columnId = value.columnId; 
     var sortAsc = value.sortAsc; 
     var sortCol = { field: columnId }; 
     var col = { sortCol: sortCol, sortAsc : sortAsc}; 
     cols.push(col); 
    }); 

    dataView.sort(function (dataRow1, dataRow2) { 

     var sortResult = 0; 
     for (var i = 0, l = cols.length; i < l; i++) { 
      if (sortResult !== 0) { 
       break; 
      } 

      var field = cols[i].sortCol.field; 
      var sign = cols[i].sortAsc ? 1 : -1; 
      var value1 = dataRow1[field] || ''; //handle nulls - otherwise erratic sorting 
      var value2 = dataRow2[field] || ''; //handle nulls - otherwise erratic sorting 

      if ($.inArray(field, dateTypeColumns) > -1) { 
       sortResult = compareDates(value1, value2) * sign; 
      } else { 
       if ($.inArray(field, numericColumns) > -1) { 
        sortResult = compareSimple(value1, value2) * sign; 
       } else { 
        sortResult = compareAlphaNumeric(value1, value2) * sign; 
       } 
      } 
     } 
     return sortResult; 
    }); 

    grid.invalidate(); 
    grid.render(); 
} 
1

मैं प्रतिष्ठा की वजह से टिप्पणियां नहीं कर सकते, जो वह जगह है जहाँ यह सबसे उपयुक्त होगा, फिर भी, मेरा उत्तर @Premshankar तिवारी और @Siddharth जवाब के संबंध में है।

मैंने सिद्धार्थ के उत्तर में dataView.fastSort विकल्प पसंद किया, जो आईई 7 और 8 को छोड़कर सभी ब्राउज़रों में मेरे लिए काम करता है। मैंने इसे आईई 9 या उससे ऊपर में परीक्षण नहीं किया। दुर्भाग्य से, मेरे नेटवर्क पर अधिकांश विरासत अनुप्रयोगों के लिए संगतता मुद्दों के कारण आईई 7 या 8 चलाते हैं। लेकिन, प्रीम्सशंकर का जवाब आईई 7 और 8 में काम करता है।

तो, मैं कुछ इस तरह कर रही है समाप्त हो गया:

if (msie > 0) { 
    $(".slick-header-columns").children().eq(5).trigger("click"); 
    $(".slick-header-columns").children().eq(4).trigger("click"); 
} else { 
    dataView.fastSort('process','unit'); 
} 

जहां स्तंभ अनुक्रमणिका (5) = 'इकाई' और स्तंभ अनुक्रमणिका (4) = 'प्रक्रिया'। ध्यान दें कि dataView.fastSort विधि में रिवर्स ऑर्डर है। मैं एक ऐसे फ़ंक्शन का भी उपयोग कर रहा हूं जो IE ब्राउज़र संस्करण का पता लगाता है और इसे msie पर असाइन करता है।

मेरे .trigger विधि का उपयोग के बारे में केवल शिकायत है कि आप अपने ग्रिड गतिशील छिपाना/दिखाना कॉलम, की स्थापना की है, तो अनुक्रमित सुविधा होगा संभावित प्रकार अनायास ही स्तंभों पर जब तक आप केवल आरंभीकरण पर बुला रहे हैं जब छिपाने/शो क्षमताओं हैं वर्तमान।

0

एक और अधिक स्वच्छ समाधान onSort के तर्क पर भरोसा करते हैं, लेकिन इसके बजाय getSortColumns कॉल करने के लिए नहीं है:

function gridSorter() { 
    var scol=grid.getSortColumns(); 
    if (scol.length===0) return; 
    var scolId=scol[0].columnId, asc=scol[0].sortAsc; 
    data.sort(function(a, b) { 
     var result = a[scolId] > b[scolId] ? 1 : a[scolId] < b[scolId] ? -1 : 0; 
     return asc ? result : -result; 
    }); 
    grid.invalidate(); 
    } 

तब कार्य करें:

grid.onSort.subscribe(gridSorter); 

यह किसी भी समय आप चाहते हैं छँटाई पैर जमाने के लिए अनुमति देगा (से AJAX के साथ डेटा को पुनः लोड करने के बाद) ग्रिडस्टर()

संबंधित मुद्दे