2016-02-17 14 views
12

ecco il mio problema: Il plug-in datatable accetta solo un array, ma la mia API restituisce un oggetto con un array. Sto cercando di capire se ho bisogno di estrarre queste informazioni (come?) O se il plug-in ha alcuni metodi che farlo per me (ne esiste uno):Datatable angolare e struttura JSON isue

//the datatable plugin expects the following JSON structure 
     [ 
      { 
       "ID":"a5f415a7-3d4f-11e5-b52f-b82a72d52c35", 
       "Record":1, 
       "HostName":"SRX552P" 
      } 
     ] 

    //my PHP server returns the following JSON structure: 
     { 
      "status":"success", 
      "message":"data retrieved", 
      "data":[ 
        { 
         "ID":"a5f415a7-3d4f-11e5-b52f-b82a72d52c35", 
         "Record":1, 
         "HostName":"SRX552P" 
        } 
        ]     
     }  

    var allData = null; 
    //this is my angularjs service where I am grabbing all the 'data': 
     function getAllData() { 
      dataservice.get('table001').then(function(data){ 
       allData = data; 
      });   
      return allData; 
     } 

    //it looks like my issue is exactly what this post describes: 
    http://stackoverflow.com/questions/27797435/accessing-json-data-in-angularjs-datatables-using-dtoptions 

    //but applying ".withDataProp('data.data')" didn't work for me: 
     ... 
      this.standardOptions = DTOptionsBuilder 
       .fromFnPromise(getAllData())   
       .withDataProp('data.data') 
       //.fromSource('api/tables/datatables.standard.json') //static data works fine!      
       //Add Bootstrap compatibility 
       .withDOM("<'dt-toolbar'<'col-xs-12 col-sm-6'f><'col-sm-6 col-xs-12 hidden-xs'l>r>" + 
        "t" + 
        "<'dt-toolbar-footer'<'col-sm-6 col-xs-12 hidden-xs'i><'col-xs-12 col-sm-6'p>>") 
       .withBootstrap();    

      this.standardColumns = [ 
       DTColumnBuilder.newColumn('ID'), 
       DTColumnBuilder.newColumn('Record'), 
       DTColumnBuilder.newColumn('HostName') 
      ]; 
     ... 

//this is the service 
(function() { 
    'use strict'; 
    angular.module('app.ipxtool').factory('dataservice', dataservice); 
    dataservice.$inject = ['$http', '$q'];  

    function dataservice($http, $q) {   
     var serviceBase = 'api/v1/'; 
     var obj = {};   
     obj.get = function (q) {                     
      return $http.get(serviceBase + q).then(success).catch(fail); 
     };   

     function success(results) {    
      if (results.data.status == "error") { 
       logger.error(results.data.message, '', 'Error'); //$response["data"] = null for errors; 
      }    

      if (results.data.status == "warning") { 
       logger.warning(results.data.message, '', 'Warning'); 
      }      

      if (results.data.status == "success") { 
       logger.success(results.data.message, results.data.data, 'Success'); //$response["data"] = $rows;    
      }     
      return results.data; 
     } 

     function fail(e) { 
       return (e); 
     }             
     return obj; 
}; 
})(); 

Uso Fiddler posso vedere tutto i dati che vengono restituiti. Anche io in uscita il primo elemento di matrice come segue:

console.log("var allData: " + "[" + JSON.stringify(alldata.data[1]) + "]"); 

enter image description here enter image description here

Ogni aiuto è apprezzato Grazie

+1

L'array deve essere in 'data.data' (senza' [1] '). Sei in grado di modificare il back-end? Suppongo che tu stia utilizzando CakePHP sulla base di quell'output. Puoi farlo produrre un array con un piccolo ritocco. – jperezov

+0

Sto usando Slim - un framework micro PHP 5. Qual è il tweak? – Max

+0

Ora posso vedere l'output aggiungendo allData = JSON.stringify (data.data); Vedo il formato corretto ma il datatable non lo accetterà ancora :-( – Max

risposta

6

La soluzione a questo problema è stato quello di aggiungere il seguente:

.fromFnPromise(function() { 
    return dataservice.get('table001'); 
}) 

Non so perché chiamare getAllData() non ha funzionato. Quindi alla fine ho risolto questa cosa. Grazie.

+0

Probabilmente potresti fare lo stesso con 'return dataservice.get ('table001')' (?) DataTables cerca una promessa e aspetta che venga risolta da '_loadedPromise.then (function (result) {' se restituisci ' dataservice.get ('table001'). then (function (data) {'allora fai effettivamente ciò che dataTables vuole fare: aspetta che la risorsa sia pronta e restituisca i dati. – davidkonrad

0

È possibile aggiungere [ e ] all'inizio e alla fine del vostro var uscita a pagina php per sé, in modo che sarebbe tornato una corretta JSON uscita. Poiché ho già affrontato questo problema in precedenza in Angular in quanto non accetta l'input diretto dell'oggetto, ho utilizzato l'approccio sopra riportato per convertirlo in un vero e proprio JSON.

aggiungere anche il codice di seguito nella parte superiore della pagina PHP:

header('Content-Type: application/json');

Così, si tornerà il contenuto nel testo in formato JSON.

+0

il PHP sta già restituendo il formato JSON.Aggiungere [] non sarebbe una soluzione in quanto ho bisogno anche dell'oggetto. Accedendo alla parte data.data mi darò l'array di cui ho bisogno. – Max

Problemi correlati