Angularjs jquery datatables 指令 - 一个视图中的多个数据表

Posted

技术标签:

【中文标题】Angularjs jquery datatables 指令 - 一个视图中的多个数据表【英文标题】:Angularjs jquery datatables directive - multiple datatables in one view 【发布时间】:2017-02-06 05:16:15 【问题描述】:

我有以下指令可以正常工作。

angular.module('myApp').directive('jqdatatable', function () 
    return 
        restrict: 'A',
        link: function (scope, element, attrs, ngModelCtrl) 

            var options = ;
            if (scope.dtOptions) 
                options = scope.dtOptions;
            
            console.log('applying data table');
            element.DataTable(options);
        
    ;
);

我像这样使用这个指令:

html

<table jqdatatable>
    <thead>
        <tr>
            <th>Col1</th>
            <th>Col2</th>
            <th>Col3</th>
        </tr>
    </thead>
    <tfoot>
        <tr>
            <th>Col1</th>
            <th>Col2</th>
            <th>Col3</th>
        </tr>
    </tfoot>         
</table>

例如来自控制器的 javascript

$scope.dtOptions = 
    'processing': true,
    'serverSide': true,
    'pageLength': 25,
    'ajax': 'read_data_tables.php'
;

但是当您在一个视图中有多个数据表时,问题就来了。 您不能多次设置 $scope.dtOptions。 似乎这种方法在这种情况下效率不高。

如果有人知道如何集成此代码以在一个视图中处理多个数据表,那就太好了。

谢谢。

【问题讨论】:

您可以将选项作为属性传递,而不是在范围内设置选项 【参考方案1】:

由于您的指令不是在一个孤立的范围内工作,它本质上是在控制器的范围内工作,这使得无法在同一页面(或至少在同一控制器范围内)控制 2 个指令。

在我看来,您有两个主要选择:

您可以创建第二个控制器来包装您的第二个指令(然后该控制器将有自己的范围,您可以在其中设置您的 dtOptions)

您可以更改指令以使用隔离范围并获取在声明中传递的参数,因此您的指令看起来像

<table jqdatatable processing="true" 
       serverSide="true" pageLength="25" 
       ajax="read_data_tables.php">

第二个指令可以有另一组参数。

第二个选项比 Angular 更加健壮和惯用,the Angular reference 中有很好的文档。但是第一个选项会让您陷入困境(实际上在同一参考页面上有一个示例,尽管他们指出这不是最佳实践)

【讨论】:

是的,你是对的。首先我想使用属性方法,然后转到嵌套控制器方法,因为我需要在代码中设置一些东西

以上是关于Angularjs jquery datatables 指令 - 一个视图中的多个数据表的主要内容,如果未能解决你的问题,请参考以下文章

如何在 AngularJS 中收听 jQuery 事件

AngularJS中的jQuery - jqlite

Angularjs 1.6.+ 是不是与 jQuery 3.5+ 兼容?

AngularJS + jQuery Mobile

jQuery VS AngularJS 你更钟爱哪个?

如何从AngularJS调用jQuery [重复]