2015-07-23 3 views
0

У меня есть выпадающий список с несколькими параметрами, которые инициализируют datatable с помощью javascript. Все работает нормально, но проблема возникает во время выполнения, в котором, когда выбрана опция второй раз я получаю сообщение об ошибке, проверьте это fiddle,Предупреждение о инициализации Datatables

DataTables warning (table id = 'defDiv'): Cannot reinitialise DataTable. 

И Ниже мой код:

if(user.position=="DEF"){ 
var table = $('#defDiv').DataTable({ 
    "aaData":defenders, 
    "iDisplayLength":15, 
    "aoColumns": [ 
     { "mDataProp": "playerInfo" }, 
     { "mDataProp": "playerName" }, 
      { "mDataProp": "playerClub" }, 
     { "mDataProp": "playerValue" }, 
     { "mDataProp": "playerPoints" }, 
    ], 
    "order": [[ 3, "desc" ]], 
    }); 
} 

Вопрос как я могу предотвратить предупреждение, если опция снова выбрана?

+0

@davidkonrad это моя ошибка. используйте «bDestroy»: true, и я удаляю свой комментарий также –

+0

Я замечаю, что идентификатор таблицы, указанный в вашем сообщении об ошибке, отличается от вашего кода - возможно, стоит посмотреть. – Ash

+0

@Ash, совпадения ID, я забыл изменить его, когда был задан вопрос. – bobin56

ответ

1

Я изменил ваш код и я т работает сейчас:

var goalkepeers = [{ 
    "playerName": "Mignolet", 
    "playerClub": "Liverpool", 
    "playerValue": "5.0", 
    "playerPoints": "89", 
}, { 
    "playerName": "de Gea", 
    "playerClub": "Manchester", 
    "playerValue": "6.7", 
    "playerPoints": "120", 
}]; 
var defenders = [{ 
    "playerName": "Ivanovic", 
    "playerClub": "Chelsea", 
    "playerValue": "7.8", 
    "playerPoints": "100", 
}, { 
    "playerName": "Mertesacker", 
    "playerClub": "Arsenal", 
    "playerValue": "7.7", 
    "playerPoints": "110", 
}]; 
var aoColumns = [{ 
    "sTitle": "Name", 
    "mDataProp": "playerName" 
},{ 
    "sTitle": "Club", 
    "mDataProp": "playerClub" 
},{ 
    "sTitle": "Value", 
    "mDataProp": "playerValue" 
},{ 
    "sTitle": "Points", 
    "mDataProp": "playerPoints" 
}]; 
var table = null; 
$("#playersFilter").change(function() { 
    var value = $('#playersFilter').val(); 
    if (value == "gk") { 
     if ($.fn.dataTable.isDataTable('#players')) { 
      $('#players').DataTable().destroy(); 
     } 
     table = $('#players').DataTable({ 
      "aaData": goalkepeers, 
      "iDisplayLength": 15, 
      "aoColumns": aoColumns, 
      "bRetrieve": true, 
      "order": [ 
       [3, "desc"] 
      ], 
      "bDestroy": true 
     }); 
    } else if (value == "def") { 
     if ($.fn.dataTable.isDataTable('#players')) { 
      $('#players').DataTable().destroy(); 
     } 
     table = $('#players').DataTable({ 
      "aaData": defenders, 
      "iDisplayLength": 15, 
      "aoColumns": aoColumns, 
      "bRetrieve": true, 
      "order": [ 
       [3, "desc"] 
      ], 
      "bDestroy": true, 
     }); 
    } 
}); 

Я довольно уверен, что есть более эффективный способ сделать это, у меня будет думать и разместить ссылку на JSFiddle как комментарий.

Вы только действительно нуждаетесь в одну таблицу, а также:

<select id="playersFilter"> 
    <option>Choose Players</option> 
    <option value="gk">goalkepeers</option> 
    <option value="def">Defenders</option> 
</select> 
<table class="display" id="players"></table> 
+0

Большое спасибо :-) Если вы найдете более простой способ, поделитесь им со мной :-) – bobin56

+0

Обновлен [JSFiddle] (http://jsfiddle.net/ux7weoto/) с более элегантный код. В основном инициализируются данные, а затем очищаются и добавляются строки (или нет) в результате события изменения. – annoyingmouse

+0

Еще раз спасибо :-), но один быстрый вопрос, если вы не возражаете, что я буду делать, если я хочу отображать голкипера и защитников из той же команды? как и представьте, добавив еще один вариант для клуба. – bobin56

0

использовать этот код

if(user.position=="DEF"){ 
var table = $('#defDiv').DataTable({ 
    "aaData":defenders, 
    "iDisplayLength":15, 
    "aoColumns": [ 
     { "mDataProp": "playerInfo" }, 
     { "mDataProp": "playerName" }, 
      { "mDataProp": "playerClub" }, 
     { "mDataProp": "playerValue" }, 
     { "mDataProp": "playerPoints" }, 
    ], 

// редактирует

 "bRetrieve":true, 
    "order": [[ 3, "desc" ]], 
     // use this in your code 

     "bDestroy": true, 
    }); 
} 

это будет работать для меня & more details

+0

Спасибо за помощь, но bDestroy только удаляет предупреждение, но не отображает таблицу, когда опция снова выбрана. – bobin56

+0

@ bobin56 использовать «bRetrieve»: истинное использование для извлечения таблицы –

+0

не против, если бы вы могли объяснить, где я должен поместить эту строку кода, так как уничтожение и повторное использование должны выполняться в том же операторе if, еще раз спасибо :-) – bobin56

0

Вы можете просто destroy стол перед повторной инициализации?

table.DataTable().destroy(); 

Что-то вроде этого:

var table; 
 

 
if ($.fn.dataTable.isDataTable('#defDiv')) { 
 
    table.DataTable().destroy(); 
 
} 
 
    
 
table = $('#defDiv').DataTable({...

документации можно найти here

Demo here

+0

Привет, я благодарю за помощь, но table destroy удаляет предупреждение, но он снова не отображает мои значения таблиц, когда опция выбрана во второй раз .... – bobin56

+0

Попробуйте замена table.destroy(); с таблицей.DataTable(). destroy(); Я соответствующим образом обновил свой ответ и добавил ссылку на (упрощенный) jsfiddle. Надеюсь, поможет. – Ash

+0

Привет, пожалуйста, проверьте это [скрипка] (https://jsfiddle.net/bobin56/et9rdg44/), и вы поймете, что пошло не так. сделайте необходимые изменения, еще раз спасибо :-) – bobin56

Смежные вопросы