मैं निम्नलिखित कोड का उपयोग करने की कोशिश कर रहा हूं और यह कॉलम को सही ढंग से सॉर्ट नहीं करेगा। डेटा सही ढंग से पूर्णांक के रूप में दिखाई दे रहा है, लेकिन जब मैं कॉलम हेडर पर क्लिक करता हूं तो यह बेतरतीब ढंग से क्रमबद्ध होता है।

{
  targets: 7,
  data: null,
  render: function(data, type, row, meta) {
    var value = Math.floor(Math.random() * Math.floor(100));
    if (type === "display") {
      return value;
    } else {
      return value;
    }

  }
},
1
David 28 जुलाई 2020, 15:11

1 उत्तर

सबसे बढ़िया उत्तर

इसका कारण यह है कि DataTables ऑर्थोगोनल डेटा को कैसे हैंडल करता है - और आपके में रैंडम नंबर जेनरेटर कैसे होता है render फ़ंक्शन उस प्रक्रिया में हस्तक्षेप कर रहा है।

समस्या

मेरे परीक्षण उदाहरण में, मेरी तालिका में डेटा की 3 पंक्तियाँ हैं। मैंने कॉलम इंडेक्स 5 का इस्तेमाल किया, 7 नहीं। यहाँ मेरा डेटाटेबल है:

$(document).ready(function() {

  $('#example').DataTable( {

    columnDefs: [
      { targets: 5,
        render: function(data, type, row, meta) {
          var x = Math.floor(Math.random() * 100);
          console.log(type + ' - ' + x);
          return x;
        }
      } 
    ]

  } );
} );

कंसोल में निम्न आउटपुट लॉग होता है:

display - 97
display - 74
display - 39
type - 17
type - 19
type - 31
filter - 55
filter - 34
filter - 28

डेटा की प्रत्येक पंक्ति के लिए, 3 अलग-अलग यादृच्छिक संख्याएँ उत्पन्न होती हैं - एक display मान, एक type मान और एक filter मान।

और जब आप पहली बार उस कॉलम को सॉर्ट करते हैं, तो यादृच्छिक संख्याओं का एक और सेट उत्पन्न होता है:

sort - 4
sort - 12
sort - 85

यह अंतिम मूल्य हैं जिनका उपयोग छँटाई के लिए किया जा रहा है - और, निश्चित रूप से वे मूल प्रदर्शन मूल्यों से एक अलग क्रम के क्रम में होने की संभावना है।

एक समाधान

एक समाधान यह है कि किसी सरणी में मूल प्रदर्शन मानों को कैप्चर किया जाए, और फिर जब भी filter या sort मान का उपयोग किया जाए तो उन मानों का उपयोग करें:

$(document).ready(function() {

  var rands = [];

  $('#example').DataTable( {

    columnDefs: [
      { targets: 5,
        type: "num",
        render: function(data, type, row, meta) {
          var x = Math.floor(Math.random() * 100);
          if ( type === 'display' ) {
            rands.push(x);
            return x;
          } else {
            return rands[meta.row];
          }
        }
      } 
    ]

  } );
} );

यहां हमने डेटाटेबल घोषित करने से पहले एक सरणी (rands) सेट की है। फिर हम उस सरणी को प्रदर्शन मानों के साथ पॉप्युलेट करते हैं जब वे प्रारंभ में उत्पन्न होते हैं। हमें आवश्यक प्रासंगिक पंक्ति अनुक्रमणिका प्रदान करने के लिए हम meta.row विशेषता का उपयोग करते हैं।

फिर, जब किसी अन्य प्रकार के ऑर्थोगोनल डेटा का सामना करना पड़ता है, तो हम सुसंगत सॉर्टिंग (और फ़िल्टरिंग) सुनिश्चित करने के लिए, हमारे सरणी से मूल प्रदर्शन मान को प्रतिस्थापित करते हैं।

0
andrewjames 28 जुलाई 2020, 17:25