DataTables внутри загрузочного аккордеона в 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"
  }
]

Как поместить этот datatable внутрь аккордеона? Потому что, делая то, что я делаю, я не могу этого достичь.


person Sana    schedule 18.01.2018    source источник
comment
А на ваш вопрос что именно?   -  person    schedule 22.01.2018
comment
Как поместить этот datatable внутрь аккордеона? Потому что, делая то, что я делаю, я не могу этого достичь.   -  person Sana    schedule 22.01.2018
comment
jsfiddle.net/manedeepak08/eV37v/1   -  person    schedule 22.01.2018
comment
Большое спасибо, но мне нужно добиться этого с помощью динамических столбцов таблиц данных с аккордеоном начальной загрузки в качестве границы.   -  person Sana    schedule 22.01.2018
comment
проверьте это и объясните, что нужно сделать codepen.io/anon/pen/rpbzpX   -  person Patata    schedule 23.01.2018
comment
Я добавил новый ответ, который решает вашу проблему.   -  person bhantol    schedule 25.01.2018


Ответы (2)


ОБНОВЛЕНО: в соответствии с новой информацией (с использованием angular-datatable)

Теперь решение сводится к вычислению столбцов и параметров для каждой группы аккордеонов.

Рабочий планкер с двумя группами аккордеонов

Как вы можете видеть в HTML-коде ниже, параметры и столбцы вычисляются для каждого аккордеона.

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

Угловой код, показывающий getDtColumns и getDtOptions. Я сохранил данные очень простыми для демонстрационных целей и скопировал текущий код dtColumns, однако вы можете настроить его так, чтобы у вас было даже более 1 типа таблицы:

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-datatable

Прежде всего, я не рекомендую jQuery DataTable или любой другой компонент jQuery в приложениях AngularJS. Я лично стараюсь не связывать jQuery и не выполнять манипуляции с DOM с помощью jQuery.

Однако, чтобы заставить вас работать с тем, что у вас есть, я предлагаю следующее: -

Удалите эти две строки, потому что простое добавление этих атрибутов 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>
person bhantol    schedule 23.01.2018
comment
Не помогает. Все еще не рендерит - person Sana; 24.01.2018
comment
Вы используете angular-datatable ? - person bhantol; 24.01.2018
comment
Хорошо, это объясняет отрицательное голосование - тогда я обновлю свой ответ. Можете ли вы сказать мне, какую версию angular-datatable вы используете? - person bhantol; 24.01.2018
comment
угловые данные - v0.6.2 - person Sana; 24.01.2018
comment
@Сана проверь сейчас - person bhantol; 24.01.2018
comment
Не могли бы вы рассказать мне, как проверить хотя бы одно радио на каждом аккордеонном столе? в настоящее время я могу выбрать только один из всех. Также как отслеживать идентификатор каждой выбранной строки таблицы при сохранении. =предварительный просмотр - person Sana; 26.01.2018
comment
Попробуйте plnkr.co/edit/JduhBW5XW3zZDLSHCMhD?p=preview проверить, как внедряется parentId - person bhantol; 26.01.2018
comment
и последнее, не могли бы вы сказать мне, как я могу добавить пейджинг внизу с этим типом реализации - person Sana; 30.01.2018
comment
Для каждой таблицы данных по умолчанию уже включено разбиение по страницам, как это можно увидеть на странице plnkr.co/edit/JduhBW5XW3zZDLSHCMhD?p=preview. Вы видите разбиение по страницам? - person bhantol; 30.01.2018
comment
Я не хочу пейджинг сверху. Я хочу, чтобы это было внизу сетки - person Sana; 30.01.2018
comment
Показать 10 записей и т. д. отображается вверху. Я хочу показать это в конце - person Sana; 30.01.2018
comment
сделал это с помощью .withOption('dom','‹topf›t‹bottom‹col-md-3i›‹col-md-4l›p›’) - person Sana; 30.01.2018

У меня была такая же проблема на переходе. Пожалуйста, используйте 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>
person Leonardo Neninger    schedule 25.01.2018
comment
Удалось ли вам добавить флажки в первый столбец таблицы данных и проверить строку по идентификатору? - person Sana; 25.01.2018