Angular 数据表和 JSON 结构问题
Angular datatable and JSON structure issue
这是我的问题:
数据表插件只接受我相信的数组,但我的 API returns 一个带有数组的对象。我想弄清楚我是否需要提取此信息(如何?),或者插件是否有一些方法可以为我做这件事(有一个):
//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:
//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]) + "]");
此问题的解决方案是添加以下内容:
.fromFnPromise(function() {
return dataservice.get('table001');
})
不确定为什么调用 getAllData()
无效。所以最后我解决了这个问题。谢谢
您可以在 php 页面本身的输出变量的开头和结尾添加 [
和 ]
,这样它将 return JSON
输出。由于我之前在 Angular
中也遇到过这样的问题,因为它不接受直接对象输入,所以我使用上述方法将其转换为成熟的 JSON
.
同时在 PHP 页面顶部添加以下代码:
header('Content-Type: application/json');
这样,它将 return JSON 格式文本中的内容。
这是我的问题: 数据表插件只接受我相信的数组,但我的 API returns 一个带有数组的对象。我想弄清楚我是否需要提取此信息(如何?),或者插件是否有一些方法可以为我做这件事(有一个):
//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:
//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]) + "]");
此问题的解决方案是添加以下内容:
.fromFnPromise(function() {
return dataservice.get('table001');
})
不确定为什么调用 getAllData()
无效。所以最后我解决了这个问题。谢谢
您可以在 php 页面本身的输出变量的开头和结尾添加 [
和 ]
,这样它将 return JSON
输出。由于我之前在 Angular
中也遇到过这样的问题,因为它不接受直接对象输入,所以我使用上述方法将其转换为成熟的 JSON
.
同时在 PHP 页面顶部添加以下代码:
header('Content-Type: application/json');
这样,它将 return JSON 格式文本中的内容。