如何基于数据表角度中的JSON动态填充表值?

时间:2016-08-05 11:40:28

标签: javascript jquery angularjs datatables angular-datatables

我正在使用Angular-Datatables。我需要能够根据返回的数据动态创建表。换句话说,我不想指定列标题。

示例:

json数据:

SELECT m.id, m.name, COUNT(c.id)
FROM COMMENT c JOIN
     medic m
     ON m.id = c.medic_id
GROUP BY m.id, m.name
ORDER BY MAX(c.created_at) DESC;

列标题:

id,city,state

有人可以帮忙吗?

3 个答案:

答案 0 :(得分:4)

这实际上是个好问题!使用传统的jQuery dataTables它不是问题,但是我们使用angular dataTables进行了不同类型的声明性设置,这使得分离各种任务变得更加困难。我们可以使用fromFnPromise来延迟数据填充,但不能阻止dataTable在我们需要之前被实例化。我想我找到了一个可靠的解决方案:

首先,为避免即时初始化,请从标记中删除datatable指令,并将<table>改为id,即:

<table id="example" dt-options="dtOptions" dt-columns="dtColumns" />

然后加载数据资源,构建dtColumnsdtOptions,最后使用datatable注入$compile属性和<table> id

$http({
  url: 'data.json'
}).success(function(data) {
  var sample = data[0], dtColumns = []

  //create columns based on first row in dataset
  for (var key in sample) dtColumns.push(
    DTColumnBuilder.newColumn(key).withTitle(key)
  )
  $scope.dtColumns = dtColumns

  //create options
  $scope.dtOptions = DTOptionsBuilder.newOptions()
    .withOption('data', data)
    .withOption('dataSrc', '')

  //initialize the dataTable
  angular.element('#example').attr('datatable', '')
  $compile(angular.element('#example'))($scope)
})

这应该适用于任何“对象数组”资源
演示 - &gt;的 http://plnkr.co/edit/TzBaaZ2Msd9WchfLDLkN?p=preview

注意:已经清理了示例JSON,我想这是一个示例,并不打算使用尾随逗号。

答案 1 :(得分:2)

面对同样的问题,我实际上发现更容易实现,更简单(并且因为不使用$ compile而更安全)解决方案。

需要对html进行的唯一更改是添加ng-if

<table ng-if="columnsReady" datatable="" dt-options="dtOptions" dt-columns="dtColumns"/>

会发生什么情况,angular会延迟此节点的创建,直到columnsReady具有任何值。现在,在您的代码中,您可以获得所需的数据,当您拥有它时,您可以将columnsReady设置为true,而角度将完成其余的工作。

$http({
  url: 'data.json'
}).success(function(data) {
  var sample = data[0], dtColumns = []

  //create columns based on first row in dataset
  for (var key in sample) dtColumns.push(
    DTColumnBuilder.newColumn(key).withTitle(key)
  )
  $scope.dtColumns = dtColumns

  //create options
  $scope.dtOptions = DTOptionsBuilder.newOptions()
    .withOption('data', data)
    .withOption('dataSrc', '')

  //initialize the dataTable
  $scope.columnsReady = true;
});

答案 2 :(得分:-2)

下面的代码将根据数据

动态地为您提供表格

<强> HTML

<div ng-controller="WithAjaxCtrl as showCase">
<table datatable="" dt-options="showCase.dtOptions" dt-columns="showCase.dtColumns" class="row-border hover"></table>

<强> JS

angular.module('showcase.withAjax',['datatables']).controller('WithAjaxCtrl', WithAjaxCtrl);

function WithAjaxCtrl(DTOptionsBuilder, DTColumnBuilder) {
var vm = this;
vm.dtOptions = DTOptionsBuilder.fromSource('data.json')
    .withPaginationType('full_numbers');
vm.dtColumns = [
    DTColumnBuilder.newColumn('id').withTitle('ID'),
    DTColumnBuilder.newColumn('city').withTitle('City'),
    DTColumnBuilder.newColumn('state').withTitle('State')
];

}

data.json

[{
"id": 860,
"city": "Superman",
"state": "Yoda"
}, {
"id": 870,
"city": "Foo",
"state": "Whateveryournameis"
}, {
"id": 590,
"city": "Toto",
"state": "Titi"
}, {
"id": 803,
"city": "Luke",
"state": "Kyle"
 },
 ...
 ]