2012-06-13 11 views
13

के साथ लोड किया गया है, तो मैं jQuery datatables का नवीनतम संस्करण उपयोग कर रहा हूं। क्या कोई कॉलबैक फ़ंक्शन है जिसका उपयोग डेटा लोड होने के बाद और डेटाटेबल में प्रदर्शित होने के बाद ही किया जा सकता है?यह निर्धारित करने के लिए कि जब jQuery डेटाटेबल बनाया गया है और डेटा

मेरे पास एक डेटाटेबल है कि मैं IE8 में प्रयोग कर रहा हूं। मेरे पास डेटा के 2 सेट हैं जिनके साथ मैं परीक्षण कर रहा हूं (जिनमें से मैं एक समय में केवल एक का उपयोग करता हूं)। मेरे पास एक जावास्क्रिप्ट सरणी है और डेटा का एक सेट है जो मुझे अजाक्स कॉल से मिलता है। मैं ASP.NET MVC 3 का उपयोग कर रहा हूं।

विन्यास कि एक अजाक्स कॉल से अपने डेटा हो जाता है:

$('#banks-datatable').dataTable({ 
    "bProcessing": true, 
    "sAjaxSource": '/Administration/Bank/List', 
    "aoColumns": [ 
      { "sTitle": "Engine" }, 
      { "sTitle": "Browser" }, 
      { "sTitle": "Platform" }, 
      { "sTitle": "Version" }, 
      { "sTitle": "Grade" } 
    ], 
    "bAutoWidth": false, 
    "bFilter": false, 
    "bLengthChange": false, 
    "iDisplayLength": 10 
}); 

alert('test'); 

जब मेरे datatable (कोई डेटा के साथ) इस तरह से datatable बनाई गई है भरी हुई है और प्रसंस्करण बॉक्स प्रदर्शित करता है और चेतावनी पॉपअप प्रदर्शित करता है। इस बिंदु पर डेटाटेबल है लेकिन डेटाटेबल में कोई डेटा लोड नहीं किया गया है। केवल जब पॉपअप चला जाता है (जब मैं पॉपअप पर ठीक बटन क्लिक करता हूं) तो डेटा डेटाटेबल में लोड हो जाता है। ऐसा क्यों है?

विन्यास कि JavaScript शृंखला से अपने डेटा हो जाता है:

var aDataSet = [ 
    ['Trident', 'Internet Explorer 4.0', 'Win 95+', '4', 'X'], 
    ['Trident', 'Internet Explorer 5.0', 'Win 95+', '5', 'C'], 
    ['Trident', 'Internet Explorer 5.5', 'Win 95+', '5.5', 'A'], 
    ['Trident', 'Internet Explorer 6', 'Win 98+', '6', 'A'], 
    ['Trident', 'Internet Explorer 7', 'Win XP SP2+', '7', 'A'], 
    ['Trident', 'AOL browser (AOL desktop)', 'Win XP', '6', 'A'], 
    ['Gecko', 'Firefox 1.0', 'Win 98+/OSX.2+', '1.7', 'A'] 
]; 

$('#banks-datatable').dataTable({ 
    "aoColumns": [ 
      { "sTitle": "Engine" }, 
      { "sTitle": "Browser" }, 
      { "sTitle": "Platform" }, 
      { "sTitle": "Version" }, 
      { "sTitle": "Grade" } 
    ], 
    "bAutoWidth": false, 
    "bFilter": false, 
    "bLengthChange": false, 
    "iDisplayLength": 10, 
    "aaData": aDataSet 
}); 

alert('test'); 

datatable बनाई गई है और डेटा लोड किया जाता है और उसके बाद ही पॉपअप प्रदर्शन करता है। यह पहले परिदृश्य से अलग है। यह एक केस क्यों है?

यदि मैं पहले परिदृश्य के साथ जाता हूं, तो क्या कोई तरीका है कि मैं निर्धारित कर सकता हूं कि डेटाटेबल को डेटा के साथ बनाया गया है और लोड किया गया है?

इस चेक के साथ मैं इसे सामान्य होना चाहता हूं ताकि इसका उपयोग किया जा सके, मैं इसे डेटा के साथ लोड करने का फैसला करता हूं।

+0

आप '.ajaxSucess' की कोशिश की? – undefined

+0

अभी तक नहीं, लेकिन क्या कोई और सामान्य है जिसे मैं बिना किसी भरोसेमंद उपयोग कर सकता हूं यदि उसे अजाक्स कॉल या सिर्फ एक सादा जावास्क्रिप्ट सरणी से डेटा मिल जाए? –

+0

हाँ, आप सही हैं, यह किसी सरणी से डेटा पुनर्प्राप्त करता है, आप ['वादा()'] (http://api.jquery.com/promise/) और 'done() 'विधियों को आजमा सकते हैं। – undefined

उत्तर

11

आप fnDrawCallback फ़ंक्शन का उपयोग कर सकते हैं। टेबल तैयार होने पर हर बार इसे बुलाया जाता है। इसमें तालिका शामिल होगी, जब डेटा को डेटा, सॉर्ट या फ़िल्टर किया जाता है।

+1

यह मेरे लिए काम किया। यह इस कार्य को किसी भी तरह से कॉल करता है अगर मैं जावास्क्रिप्ट सरणी से या अजाक्स कॉल से आने वाले डेटा का उपयोग करता हूं। धन्यवाद। –

+0

हालांकि यदि आप केवल "ऑनलोड" ईवेंट चाहते हैं तो अतिरिक्त चर आवश्यक है। –

2

मुझे हमेशा जावास्क्रिप्ट को एकल थ्रेड होने के लिए जाना जाता है। यहाँ एक पोस्ट है कि समर्थन करने के लिए है:

Is JavaScript guaranteed to be single-threaded?

पहले परिदृश्य आप सर्वर से डेटा हो रही है, और फिर एक चेतावनी बॉक्स के साथ धागा पकड़ में। दूसरे परिदृश्य में आप डेटा को पूर्व-पॉप्युलेट करते हैं। मेरा मानना ​​है कि यह अंतर है।

यह पृष्ठ दिखाता है कि कैसे सफलता पर एक कॉलबैक कॉल करने के लिए:

http://datatables.net/usage/callbacks#fnServerData

// POST data to server 
$(document).ready(function() { 
    $('#example').dataTable({ 
    "bProcessing": true, 
    "bServerSide": true, 
    "sAjaxSource": "xhr.php", 
    "fnServerData": function (sSource, aoData, fnCallback) { 
     $.ajax({ 
     "dataType": 'json', 
     "type": "POST", 
     "url": sSource, 
     "data": aoData, 
     "success": fnCallback 
     }); 
    } 
    }); 
}); 
20

बेहतर होगा कि तुम का उपयोग fnInitComplete:

$(document).ready(function() { 
    $('#example').dataTable({ 
     "fnInitComplete": function (oSettings, json) { 
      alert('DataTables has finished its initialisation.'); 
     } 
    }); 
}) 
+0

धन्यवाद, जब मुझे AJAX डेटा पुनर्प्राप्त किया गया था और जीयूआई अपडेट किया गया था तो मुझे कैप्चर करने की आवश्यकता थी। – 1DMF

+0

डेटाटेबल्स 1.10 का एक नया संस्करण थोड़ा बदल गया एपीआई के साथ जारी किया गया है। कॉलबैक सूची: http://datatables.net/reference/option/ – Xdg

+0

मैं 1.10 का उपयोग कर रहा हूं और उपर्युक्त ठीक काम कर रहा है। – 1DMF

0

तुम भी "सफलता" के लिए remplacement रूप dataSrc उपयोग कर सकते हैं चूंकि इसे ओवरलोड नहीं किया जाना चाहिए:

यहां डेटाटेबल्स के टिपिकल उदाहरण के साथ।शुद्ध

var table = $('#example').DataTable({ 
    "ajax": { 
      "type" : "GET", 
      "url" : "ajax.php", 
      "dataSrc": function (json) { 
       //Make your callback here. 
       alert("Done!"); 
       return json.data; 
       }  
      }, 
    "columns": [ 
      { "data": "name" }, 
      { "data": "position" }, 
      { "data": "office" }, 
      { "data": "extn" }, 
      { "data": "start_date" }, 
      { "data": "salary" } 

     ] 
    }); 
6

DataTable JQuery के नए संस्करण पर, विधि कहा जाता है: initComplete

https://datatables.net/reference/option/initComplete

+0

बिल्कुल सही! मैं विशिष्ट डेटाटेबल्स वाले टैब से जुड़े बैज को पॉप्युलेट करने के लिए एक फ़ंक्शन को बंद करने की कोशिश कर रहा था और शून्य डेटा प्राप्त कर रहा था, क्योंकि सभी डेटा पुनर्प्राप्त किए जाने से पहले कोड फायरिंग कर रहा था (सर्वर पक्ष AJAX से)। इस कॉल में उस कॉल कॉल में देरी हुई जब तक कि सभी डेटा वापस नहीं आ गया। – ScottLenart