2016-11-17 7 views
0

im nicht wirklich in jQuery, aber ich brauche, es zu lernen, so kann ich einige Projekte im verwirklichen arbeiten weiter.Mehrere Objekte in einem Array

Ich benutze Datentabellen mit dem select-Anschiebetisch-Reihen zu multiselect. Danach muss ich mit den Werten dieser Zeilen in PHP arbeiten. All das wirkt schon wie ein Zauber, Problem ist, dass ich nur einen Tisch innerhalb eines Formulars benutzen kann. Das heißt, ich bekomme nur die Ergebnisse der ersten Tabelle mit der Klasse "table_select" in eine $ _POST-Variable.

Ich habe versucht, den jQuery-Code so zu ändern, dass alle Objekte mit dieser Klasse iteriert werden, also habe ich ein Array erstellt und versucht, dieses Array mit [Array.length] zu pushen, bekomme aber nur Werte in Array [0].

Was mache ich falsch?

var table = []; 

table[table.length] = $('.table_select').DataTable({ 
    'initComplete': function(){ 
    var api = this.api(); 
    api 
     .rows() 
      .every(function(){ 
      var data = this.data(); 
      if(data[1] === '1'){ 
       api.cells(this.index(), 0).checkboxes.select(); 
      } 
     }); 
    }, 
    order: [[2, "asc"]], 
    paging:false, 
    info:false, 
    filter:false, 
    language: { 
     "url": "//cdn.datatables.net/plug-ins/9dcbecd42ad/i18n/German.json", 
    }, 
    columns: [ 
     null, 
     { "visible": false}, 
     null 
    ], 
    'columnDefs': [{ 
     'targets': 0, 
     'checkboxes': { 
      'selectRow': true, 
      'selectAll': false 
     } 
    }], 
    select: { 
     style: 'multi' 
    } 
}); 
flen = table.length; 

Flen ist immer "1" in diesem Fall, auch wenn i 4 Tabes haben mit dem "table_select" -Klasse.

Vielen Dank im Voraus für jede Hilfe!

Edit:

änderte ich den Code auf der Grundlage der Kommentare:

table = $('.table_select').DataTable({ 
    'initComplete': function(){ 
    var api = this.api(); 
    api 
     .rows() 
      .every(function(){ 
      var data = this.data(); 
      if(data[1] === '1'){ 
       api.cells(this.index(), 0).checkboxes.select(); 
      } 
     }); 
    }, 
    order: [[2, "asc"]], 
    paging:false, 
    info:false, 
    filter:false, 
    language: { 
     "url": "//cdn.datatables.net/plug-ins/9dcbecd42ad/i18n/German.json", 
    }, 
    columns: [ 
     null, 
     { "visible": false}, 
     null 
    ], 
    'columnDefs': [{ 
     'targets': 0, 
     'checkboxes': { 
      'selectRow': true, 
      'selectAll': false 
     } 
    }], 
    select: { 
     style: 'multi' 
    } 
}); 

alert(table.length); 

Die Warnung in diesem Fall i Allways "0".

Edit2: Beispiel jsfiddle: jsfiddle.net/tu59s6Ls

Antwort

0

lassen Sie mich erklären, was Sie tun

var table = []; // this is setting length 0 as no value 


table[table.length] = ... // here you are setting table[0] = ... 

dies bedeutet, dass Sie den gesamten Wert im Index setzen 0. so was auch immer oblect von jQuery kommt seine Datentabelle auf dem Index 0, so ist die Länge der Tabelle immer 1

Sie müssen den gesamten Wert in der Tabelle variabel einzustellen nicht am Index 0

table = ... 
+0

ok, ich verstehe, was Sie meinen, missunderstood i die Beschreibung in http://www.w3schools.com/js/js_arrays.asp mit "Schieben Arrays". Ich brauche jedes Element (genau: Tabelle) mit der "table_select" -Klasse, um in einem Array zu sein, also wenn ich 4 Tabellen habe, brauche ich "table [0]", "table [1]", "Tabelle [2]", "Tabelle [3]". Wie kann ich das erreichen? – Daniel

0

In Ihrem Code ist die table Variable Array, und in der ersten Position des Arrays (Tabelle [0]) setzen Sie einen Verweis auf die DataTable Elemente. Möglicherweise haben Sie 4 Elemente mit der Klasse table_select, aber Sie speichern die Referenz auf sie im ersten Element (und nicht in der Variablen).

Also eigentlich - table[0].length == 4, aber table.length == 0.

Sie

table[0].lenght 

oder

table = $('.table_select').DataTable 

verwenden können (ohne das Array haben Sie es) .

+0

Ich habe versucht, 'table = $ ('. Table_select'). DataTable' flen in diesem Fall ist immer" 0 " – Daniel

+0

Können Sie ein funktionierendes Beispiel zur Verfügung stellen? (jsfiddle oder so). Die 'datatable' Funktion sollte ein jquery Objekt mit Elementen zurückgeben, auf die es angewendet wurde (und wenn Sie wirklich 4 Tabellen haben, sollte die Länge 4 sein). – Dekel

+0

Was passiert, wenn Sie 'alert ($ ('. Table_select'). Length)' 'ausführen? – Dekel

0

Datatable nicht zurückkehrt, wenn instanziiert, die gewünschten Daten.

Sie können darauf zugreifen mit Kontextdata()

Also, wenn instantiate die Datentabelle, es auf eine Variable speichern, zugreifen dann diese Variable .context.data() Eigenschaft

bearbeiten

Verwenden Sie .data() anstelle von Kontext

$(document).ready(function() { 
 
    let datatable = $('.table_select').DataTable({ 
 
    'initComplete': function() { 
 
     var api = this.api(); 
 
     api 
 
     .rows() 
 
     .every(function() { 
 
      var data = this.data(); 
 
      if (data[1] === '1') { 
 
      api.cells(this.index(), 0).checkboxes.select(); 
 
      } 
 
     }); 
 
    }, 
 
    order: [ 
 
     [2, "asc"] 
 
    ], 
 
    paging: false, 
 
    info: false, 
 
    filter: false, 
 
    language: { 
 
     "url": "//cdn.datatables.net/plug-ins/9dcbecd42ad/i18n/German.json", 
 
    }, 
 
    columns: [ 
 
     null, { 
 
     "visible": false 
 
     }, 
 
     null 
 
    ], 
 
    'columnDefs': [{ 
 
     'targets': 0, 
 
     'checkboxes': { 
 
     'selectRow': true, 
 
     'selectAll': false 
 
     } 
 
    }], 
 
    select: { 
 
     style: 'multi' 
 
    } 
 
    }); 
 

 
    let table = datatable.data(); 
 

 
    alert(table.length); 
 
    alert($('.table_select').length); 
 
});
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet" /> 
 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<script src="https://cdn.datatables.net/v/bs/jszip-2.5.0/pdfmake-0.1.18/dt-1.10.12/b-1.2.2/b-colvis-1.2.2/b-flash-1.2.2/b-html5-1.2.2/b-print-1.2.2/fh-3.1.2/se-1.2.0/datatables.min.js"></script> 
 
<link href="https://cdn.datatables.net/v/bs/jszip-2.5.0/pdfmake-0.1.18/dt-1.10.12/b-1.2.2/b-colvis-1.2.2/b-flash-1.2.2/b-html5-1.2.2/b-print-1.2.2/fh-3.1.2/se-1.2.0/datatables.min.css" rel="stylesheet" /> 
 
<form id="form_login" action="" data-parsley-validate class="form-horizontal form-label-left select_table_form" method="post"> 
 
    <table class="table table_select table-hover display" width="100%;" cellspacing="0"> 
 
    <thead> 
 
     <tr> 
 
     <th> 
 
     </th> 
 
     <th> 
 
     </th> 
 
     <th> 
 
      Test 
 
     </th> 
 
     </tr> 
 
    </thead> 
 
    <tbody> 
 
     <tr> 
 
     <td> 
 
      Test 
 
     </td> 
 
     <td> 
 
      Test 
 
     </td> 
 
     <td> 
 
      Value 1 
 
     </td> 
 
     </tr> 
 
    </tbody> 
 
    </table> 
 
    <table class="table table_select table-hover display" width="100%;" cellspacing="0"> 
 
    <thead> 
 
     <tr> 
 
     <th> 
 
     </th> 
 
     <th> 
 
     </th> 
 
     <th> 
 
      Test 
 
     </th> 
 
     </tr> 
 
    </thead> 
 
    <tbody> 
 
     <tr> 
 
     <td> 
 
      Test 
 
     </td> 
 
     <td> 
 
      Test 
 
     </td> 
 
     <td> 
 
      Value 1 
 
     </td> 
 
     </tr> 
 
    </tbody> 
 
    </table> 
 
    <table class="table table_select table-hover display" width="100%;" cellspacing="0"> 
 
    <thead> 
 
     <tr> 
 
     <th> 
 
     </th> 
 
     <th> 
 
     </th> 
 
     <th> 
 
      Test 
 
     </th> 
 
     </tr> 
 
    </thead> 
 
    <tbody> 
 
     <tr> 
 
     <td> 
 
      Test 
 
     </td> 
 
     <td> 
 
      Test 
 
     </td> 
 
     <td> 
 
      Value 1 
 
     </td> 
 
     </tr> 
 
    </tbody> 
 
    </table> 
 
    <table class="table table_select table-hover display" width="100%;" cellspacing="0"> 
 
    <thead> 
 
     <tr> 
 
     <th> 
 
     </th> 
 
     <th> 
 
     </th> 
 
     <th> 
 
      Test 
 
     </th> 
 
     </tr> 
 
    </thead> 
 
    <tbody> 
 
     <tr> 
 
     <td> 
 
      Test 
 
     </td> 
 
     <td> 
 
      Test 
 
     </td> 
 
     <td> 
 
      Value 1 
 
     </td> 
 
     </tr> 
 
    </tbody> 
 
    </table> 
 
</form>

+0

Danke für den Tipp. Ich bekomme jetzt 4 Objekte im Array, aber es scheint, als ob ich die relevanten Daten in diesem Schritt verliere: [https://jsfiddle.net/tu59s6Ls/1/] Basierend auf diesem Skript [http: //www.gyrocode .com/articles/jquery-datatables-checkboxes /] Ich versuche, die Werte aller ausgewählten Zeilen zu erhalten. Aber wenn ich die Objekte wie in der JSFiddle ablege, scheint es keine Daten mehr dafür zu geben. – Daniel

+0

@Daniel hat es gerade aktualisiert. Verwenden Sie .data() wie oben beschrieben – GiuServ

+0

@GuiServ Just update meine jsfiddle https://jsfiddle.net/tu59s6Ls/2/ Ich bekomme die Daten aus den Tabellen, aber ich bekomme nicht den Wert "1", wenn die Zeile ausgewählt ist, werden nur die Anfangswerte auf '1' gesetzt. Auch ich habe sie nur in jQuery, während ich sie in einer $ _POST-Variable brauche, um mit dem Ergebnis in PHP zu arbeiten. Nach dem Absenden bekomme ich nur die ausgewählten Zeilen aus der ersten Tabelle im Formular, die anderen werden ignoriert. Ich denke, ich muss über jedes Objekt mit dem hinzugefügten Code iterieren. Danke für all die Mühe, ich hoffe, dass ich mich zumindest verständlich ausdrücken Btw: Wie kann ich jsfiddle mit submit arbeiten? – Daniel