bootstrap 中的数据表 angularjs 中的手风琴
DataTables inside bootstrap accordion in angularjs
我正在开发一个模块,我必须重新设计一些产品。以下是之前商品显示方式的截图。
现在产品将显示在其特定名称的手风琴中。我必须使用 ui.bootstrap 版本:0.11.0 - 2014-05-01。以下是产品现在将如何展示的草图。在每个手风琴中,将有一个特定产品的数据表,其中的列将动态生成,我们将能够检查我们想要的特定产品。
以下是我的 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"
}
]
如何将此数据表放入手风琴中?因为无论我做什么,我都无法实现。
更新:根据新信息(使用 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>
Angular 显示 getDtColumns 和 getDtOptions 的代码。为了演示目的,我将数据保持得非常简单,并复制了当前的 dtColumns
代码,但是您可以对其进行自定义,这样您甚至可以拥有不止一种类型的 table :
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;
};
});
没有 angular-数据的旧答案table
首先,我不推荐 jQuery DataTable 或 AngularJS 应用程序中的任何其他 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 如下所示:
<table id="dtVoice"
class="table manage-user-table offer-mgt-table"
dt-options="dtOptions"
dt-columns="dtColumns" my-datatable></table>
我在通行证上遇到了同样的问题。
当手风琴项处于活动状态时,请使用 ng-if 作为重新创建 table 的标志。手风琴和标签组件避免显示 table。
下面的代码可以help.Notice 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>
我正在开发一个模块,我必须重新设计一些产品。以下是之前商品显示方式的截图。
现在产品将显示在其特定名称的手风琴中。我必须使用 ui.bootstrap 版本:0.11.0 - 2014-05-01。以下是产品现在将如何展示的草图。在每个手风琴中,将有一个特定产品的数据表,其中的列将动态生成,我们将能够检查我们想要的特定产品。
以下是我的 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"
}
]
如何将此数据表放入手风琴中?因为无论我做什么,我都无法实现。
更新:根据新信息(使用 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>
Angular 显示 getDtColumns 和 getDtOptions 的代码。为了演示目的,我将数据保持得非常简单,并复制了当前的 dtColumns
代码,但是您可以对其进行自定义,这样您甚至可以拥有不止一种类型的 table :
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;
};
});
没有 angular-数据的旧答案table
首先,我不推荐 jQuery DataTable 或 AngularJS 应用程序中的任何其他 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 如下所示:
<table id="dtVoice"
class="table manage-user-table offer-mgt-table"
dt-options="dtOptions"
dt-columns="dtColumns" my-datatable></table>
我在通行证上遇到了同样的问题。 当手风琴项处于活动状态时,请使用 ng-if 作为重新创建 table 的标志。手风琴和标签组件避免显示 table。
下面的代码可以help.Notice 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>