我正在使用固定 header jquery plugin的稳定版本稳定版本v2.1.2。我正在尝试修复表头。我已经使用here提到的Angular数据表创建了表。

在 Controller 类中,我编写了以下代码,

app.controller("SampleController", function ($scope) {

    $(document).ready( function () {
        var table = $('#example').DataTable();
        new $.fn.dataTable.FixedHeader( table );
    });

});

我的HTML如下,
 <table id="example" datatable="ng" dt-options="dtOptions" dt-column-defs="dtColumnDefs" fix-header>
              <thead>
                <tr>
                    <th>Name </th>
                </tr>
               </thead>
              <tbody>
                   <tr ng-repeat="item in items">
                        <td>{{item.name}} </td>
                   </tr>
              </tbody>
 </table>

但是,当我运行我的应用程序时,出现以下错误,



我也尝试使用以下指令,因为我知道不应该在Controller中执行DOM操作,但是会收到以下错误。



更新:

我的指令
app.directive('fixHeader', function () {
    return {
        restrict: 'AE', //attribute or element
        replace: true,
        link: function ($scope, elem, attr) {
            $scope.table = elem.find("#example");
            console.log($scope.table);
            var table= $scope.table.dataTable();
            new $.fn.dataTable.FixedHeader(table);
        }
    };
});

请有人提出更好的解决方案?

我正在使用 dataTables.fixedHeader.js 2.1.2 版本,我的错误出现在下面的行中
 var dt = $.fn.dataTable.Api ?
        new $.fn.dataTable.Api( mTable ).settings()[0] :
        mTable.fnSettings();

    dt._oPluginFixedHeader = this; //error over here

最佳答案

angular-datatables还为Angular应用程序提供了FixedHeader works with datatables. You need to add the files angular-datatables.fixedheader.min.js to your HTML. You also need to add the dependency datatables.fixedheader`的插件。那么您的代码将如下所示。

HTML

<table datatable="" dt-options="dtOptions" dt-columns="dtColumns" class="row-border">
    <thead>
        <tr>
            <th>Name </th>
        </tr>
    </thead>
    <tbody>
        <tr ng-repeat="item in items">
            <td>{{item.name}} </td>
        </tr>
    </tbody>
</table>

CODE
var app = angular.module('app', ['datatables', 'datatables.fixedheader'])
app.controller("SampleController", function($scope, DTOptionsBuilder, DTColumnBuilder) {
    $scope.dtOptions = DTOptionsBuilder.fromSource('data.json')
        .withPaginationType('full_numbers')
        .withDisplayLength(25)
        .withFixedHeader({
            bottom: true
        });
    $scope.dtColumns = [
        DTColumnBuilder.newColumn('id').withTitle('ID'),
        DTColumnBuilder.newColumn('Name').withTitle('Name'),
        DTColumnBuilder.newColumn('Address').withTitle('Address')
    ];
});

不需要添加指令,因为angular-datatables.fixedheader.min.js(Reference Link)内部已经创建了指令

更新:

下面的更改需要在代码中完成。
  • FixedHeader js代码和jquery代码替换为new $.fn.dataTable.FixedHeader($element.find('#example'))
  • 调用该方法将设置FixedHeader

  • Controller
    (function(angular) {
        angular.module('showcase.angularWay', ['datatables'])
        .controller('AngularWayCtrl', AngularWayCtrl);
    
        function AngularWayCtrl($http, $element) {
            var vm = this;
            $http.get('data.json').then(function(res) {
                vm.persons = res.data;
                vm.setFixedHeader(); //call method to set glass.
            });
    
            vm.setFixedHeader = function(){
                //var table = $element.find('#example').DataTable();
                new $.fn.dataTable.FixedHeader($element.find('#example'))
            };
        }
    })(angular);
    

    您也可以将此代码移动到指令,只需要删除作为额外标题附加的标题列。

    我为上面更新的解决方案引用了this link

    Working Plunkr

    10-06 11:58