Datajables在angularjs中的bootstrap手风琴中

时间:2018-01-18 13:52:08

标签: angularjs datatables angular-datatables bootstrap-accordion

我正在开发一个模块,我必须重新设计一些产品。以下是产品之前如何显示的屏幕截图。

enter image description here

现在产品将以其特定名称的手风琴显示。我一定会使用ui.bootstrap版本:0.11.0 - 2014-05-01。以下是现在如何显示产品的草图。在每个手风琴中都会有一个特定产品的数据表,其中列将动态生成,我们将能够检查我们想要的特定产品。

enter image description here

以下是我的HTML代码:

                <accordion>
                    <accordion-group ng-repeat="AllProduct in AllProducts">
                        <accordion-heading>
                            {{AllProduct.TypeName}}
                           </accordion-heading>

                    </accordion-group>
                    <table id="dtVoice" class="table manage-user-table offer-mgt-table" dt-options="dtOptions" dt-columns="dtColumns"></table>
                </accordion>

我动态创建数据表的方式如下:

 dtColumns.push(DTColumnBuilder.newColumn(null).withTitle('').notSortable()
          .renderWith(function(data, type, full, meta) {
              return '<input type="checkbox" ng-model="showCase.selected[' + data.id + ']"/>';
          }));

        for (var key in $scope.VoiceProducts[0]) {
            if (key == "ProductName" || key == "LongDistanceMinutes" || key == "IsCallWaiting") {
                dtColumns.push(
                  DTColumnBuilder.newColumn(key).withTitle(key)

                )
            }

            $scope.dtColumns = dtColumns;
            $scope.dtOptions = DTOptionsBuilder.newOptions()
              .withOption('data', $scope.VoiceProducts)
              .withOption('dataSrc', '')


            angular.element('#dtVoice').attr('datatable', '')
        }
       $compile(angular.element('#dtVoice'))($scope);

以下是我的json

 [
  {
    "ProductList": [
      {
        "ProductName": "Voice",
        "IsActive": false,
        "IsDeleted": false,
        "LongDistanceMinutes": "",
        "IsCallWaiting": "",
        "CallWaitingId": "",
        "IsThreeWayCalling": "",
        "IsCallerId": "",
        "IsCallForwarding": "",
        "IsCallRejection": "",
        "ID": 552,
        "OfferId": 0
      }
    ],
    "ID": 2,
    "IsActive": false,
    "IsDeleted": false,
    "TypeName": "Voice"
  }
]

如何将此数据表放入手风琴中?因为我做了什么,我无法实现它。

2 个答案:

答案 0 :(得分:0)

我在传球上遇到了同样的问题。 当手风琴项目处于活动状态时,请使用ng-if作为标志来重新创建表格。手风琴和标签组件避免显示表格。

以下代码可以提供帮助。请注意ng-click和ng-if

<accordion>
                <accordion-group ng-repeat="AllProduct in AllProducts">
                    <accordion-heading ng-click="setGroup('AllProduct.TypeName')">
                        {{AllProduct.TypeName}}
                       </accordion-heading>

                       <table id="dtVoice" ng-if="group=='AllProduct.TypeName'" class="table manage-user-table offer-mgt-table" dt-options="dtOptions" dt-columns="dtColumns"></table>

                </accordion-group>

            </accordion>

答案 1 :(得分:-1)

更新:根据新信息(使用angular-datatable)

解决方案现在归结为计算每个手风琴组的列和选项。

Working Plunker with 2 accordion groups

正如您在下面的HTML中所看到的,选项和列是按手风琴计算的。

<table datatable class="table manage-user-table offer-mgt-table"  dt-options="getDtOptions(AllProduct)" dt-columns="getDtColumns(AllProduct)"></table>

显示getDtColumns和getDtOptions的角度代码。为了演示目的,我保持数据非常简单并复制了当前的dtColumns代码,但是您可以自定义它,以便您甚至可以拥有多种类型的表:

var app = angular.module('myApp', ['ui.bootstrap', 'datatables']);
app.controller('myCtrl', function($scope, DTColumnBuilder, DTOptionsBuilder, DTColumnDefBuilder, $timeout, AllProducts) {
  $scope.AllProducts = AllProducts


  $scope.getDtColumns = function(allProduct) {
    var items = allProduct.ProductList;
    if (allProduct.dtColumns) allProduct.dtColumns.length = 0;
    allProduct.dtColumns =  allProduct.dtColumns || [];
    var dtColumns = allProduct.dtColumns;
    dtColumns.push(DTColumnBuilder.newColumn('').withTitle('').notSortable()
      .renderWith(function(data, type, full, meta) {
        return '<input type="checkbox" ng-model="showCase.selected[' + full.id + ']"/>';
      }));


    for (var key in items[0]) {
      if (key == "ProductName" || key == "LongDistanceMinutes" || key == "IsCallWaiting") {
        dtColumns.push(
          DTColumnBuilder.newColumn(key).withTitle(key).notSortable()
        )
      }
    }

    return dtColumns;
  };

  $scope.getDtOptions = function(allProduct) {
    if (allProduct.options) return allProduct.options;
    var items = allProduct.ProductList;
    allProduct.options = allProduct.options || DTOptionsBuilder.newOptions().withOption('aaData', items);
    return allProduct.options;     
  };


});

没有角度数据表的老答案

首先,我不建议在AngularJS应用程序中使用jQuery DataTable或任何其他jQuery组件。我个人尝试不使用jQuery捆绑jQuery或执行DOM操作。

然而,为了让你得到你所拥有的东西,我建议如下: -

删除这两行是因为简单地动态添加这些属性datatable不会触发DataTable绑定: -

angular.element('#dtVoice').attr('datatable', '')
        }
       $compile(angular.element('#dtVoice'))($scope);

并尝试使用以下内容: -

$('#dtVoice')。DataTable({columnDefs:$ scope.dtColumns});

更多只是为了清理一下我创建了一个新的指令(只是大声打字):

app.directive('myDatatable`, function(){
return {
   restrict: 'A',
   scope: {
       'dtColumns': '='
   }
   link: function($scope, elem, attr) {
        $('#dtVoice').DataTable( {columnDefs: $scope.dtColumns});    
   } 
};
});

和你的表格如下:

<table id="dtVoice" 
    class="table manage-user-table offer-mgt-table" 
      dt-options="dtOptions" 
      dt-columns="dtColumns" my-datatable></table>