12

这是我的问题:数据表插件只接受我相信的数组,但我的 API 返回一个带有数组的对象。我试图弄清楚是否需要提取此信息(如何?)或者插件是否有一些方法可以为我做到这一点(有一个):

    //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;   
};
})();

使用 Fiddler 我可以看到所有正在返回的数据。我还输出第一个数组项,如下所示:

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

在此处输入图像描述 在此处输入图像描述

4

2 回答 2

6

此问题的解决方案是添加以下内容:

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

不知道为什么打电话getAllData()不起作用。所以最后我把这件事解决了。谢谢。

于 2016-02-23T20:35:15.547 回答
0

您可以在 php 页面本身的输出变量的开头和结尾添加[ 和,以便它返回正确的输出。由于我之前也遇到过这样的问题,因为它不接受直接的 Object 输入,所以我使用上述方法将其转换为 full-fledged 。]JSONAngularJSON

还要在 PHP 页面顶部添加以下代码:

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

因此,它将以 JSON 格式的文本返回内容。

于 2016-02-26T15:27:53.767 回答