DataTables尝试使用RequireJS访问datatables.net.js。

21

我正在尝试使用RequireJS配置DataTables,但我的配置总是导致此错误:

require.js:1926 GET https://preview.c9users.io/{username}/{workspace}/lib/datatables.net.js
Uncaught Error: Script error for: datatables.net

我的 lib/DataTables/*(包括所有模块)和 lib/requirejs.js 都需要存储在文件夹 lib 中,所以我不明白为什么它正在尝试访问文件 datatables.net.js,因为没有任何配置文件中提到这样的字符串。

JSFiddle(经过编辑用于 JSFiddle 的目的):http://jsfiddle.net/42ucpwee/1/

我的配置是否有误或错误的原因是什么?

script.js:

define(['jquery','datatables'], function($) {
    $('#example').DataTable();
});

main.js:

requirejs.config({
    //appDir: "../",
    baseUrl: "lib",
    paths: {
        'jquery': '//ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min',
        'bootstrap': '//maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min',
        /* Error is the same, I can't even use this CDN URL (I need the editor) 
        'datatables': 'https://cdn.datatables.net/s/bs-3.3.5/jszip-2.5.0,pdfmake-0.1.18,dt-1.10.10,af-2.1.0,b-1.1.0,b-colvis-1.1.0,b-flash-1.1.0,b-html5-1.1.0,b-print-1.1.0,cr-1.3.0,fc-3.2.0,fh-3.1.0,kt-2.1.0,r-2.0.0,rr-1.1.0,sc-1.4.0,se-1.1.0/datatables.min',
        */
        'datatables': 'DataTables/datatables',//'DataTables/datatables.min' exactly same error
        'script': '../js/script'
    },
    shim: {
        'bootstrap': {
            deps: ['jquery']
        },
        'jquery': {
            exports: '$'
        },
        'datatables': {
            deps: ['bootstrap','jquery']
        },
        'script': {
            deps: ['jquery','datatables']
        }
    }
});
requirejs(['script']);

index.html:

<html>
<head>
    <link rel="stylesheet" href="https://cdn.datatables.net/s/bs-3.3.5/jszip-2.5.0,pdfmake-0.1.18,dt-1.10.10,af-2.1.0,b-1.1.0,b-colvis-1.1.0,b-flash-1.1.0,b-html5-1.1.0,b-print-1.1.0,cr-1.3.0,fc-3.2.0,fh-3.1.0,kt-2.1.0,r-2.0.0,rr-1.1.0,sc-1.4.0,se-1.1.0/datatables.min.css" type="text/css" />
    <script type="text/javascript" src="js/require.js"></script>
    <script type="text/javascript" src="js/main.js"></script>
</head>
<body>
    <table id="example" class="display" cellspacing="0" width="100%">
        <thead>
            <tr>
                <th>Name</th>
                <th>Position</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>Tiger Nixon</td>
                <td>System Architect</td>
            </tr>
        </tbody>
    </table>
</body>
</html>

似乎让我有了一些进展,现在我遇到了datatables.js:93165 Uncaught TypeError: Cannot read property 'defaults' of undefined错误。

问题链接:[DataTables+RequireJS: Cannot read property 'defaults' of undefined][1]

一些模块按照您的描述工作,但有些没有,可能也与它们导入的顺序有关。以下是官网上描述的完整顺序:

<link rel="stylesheet" type="text/css" href="Bootstrap-3.3.5/css/bootstrap.min.css"/>
<link rel="stylesheet" type="text/css" href="DataTables-1.10.10/css/dataTables.bootstrap.min.css"/>
<link rel="stylesheet" type="text/css" href="AutoFill-2.1.0/css/autoFill.bootstrap.css"/>
<link rel="stylesheet" type="text/css" href="Buttons-1.1.0/css/buttons.bootstrap.min.css"/>
<link rel="stylesheet" type="text/css" href="ColReorder-1.3.0/css/colReorder.bootstrap.min.css"/>
<link rel="stylesheet" type="text/css" href="Editor-1.5.2/css/editor.bootstrap.min.css"/>
<link rel="stylesheet" type="text/css" href="FixedColumns-3.2.0/css/fixedColumns.bootstrap.min.css"/>
<link rel="stylesheet" type="text/css" href="FixedHeader-3.1.0/css/fixedHeader.bootstrap.min.css"/>
<link rel="stylesheet" type="text/css" href="KeyTable-2.1.0/css/keyTable.bootstrap.min.css"/>
<link rel="stylesheet" type="text/css" href="Responsive-2.0.0/css/responsive.bootstrap.min.css"/>
<link rel="stylesheet" type="text/css" href="RowReorder-1.1.0/css/rowReorder.bootstrap.min.css"/>
<link rel="stylesheet" type="text/css" href="Scroller-1.4.0/css/scroller.bootstrap.min.css"/>
<link rel="stylesheet" type="text/css" href="Select-1.1.0/css/select.bootstrap.min.css"/>

<script type="text/javascript" src="jQuery-2.1.4/jquery-2.1.4.min.js"></script>
<script type="text/javascript" src="Bootstrap-3.3.5/js/bootstrap.min.js"></script>
<script type="text/javascript" src="JSZip-2.5.0/jszip.min.js"></script>
<script type="text/javascript" src="pdfmake-0.1.18/build/pdfmake.min.js"></script>
<script type="text/javascript" src="pdfmake-0.1.18/build/vfs_fonts.js"></script>
<script type="text/javascript" src="DataTables-1.10.10/js/jquery.dataTables.min.js"></script>
<script type="text/javascript" src="DataTables-1.10.10/js/dataTables.bootstrap.min.js"></script>
<script type="text/javascript" src="AutoFill-2.1.0/js/dataTables.autoFill.min.js"></script>
<script type="text/javascript" src="AutoFill-2.1.0/js/autoFill.bootstrap.min.js"></script>
<script type="text/javascript" src="Buttons-1.1.0/js/dataTables.buttons.min.js"></script>
<script type="text/javascript" src="Buttons-1.1.0/js/buttons.bootstrap.min.js"></script>
<script type="text/javascript" src="Buttons-1.1.0/js/buttons.colVis.min.js"></script>
<script type="text/javascript" src="Buttons-1.1.0/js/buttons.flash.min.js"></script>
<script type="text/javascript" src="Buttons-1.1.0/js/buttons.html5.min.js"></script>
<script type="text/javascript" src="Buttons-1.1.0/js/buttons.print.min.js"></script>
<script type="text/javascript" src="ColReorder-1.3.0/js/dataTables.colReorder.min.js"></script>
<script type="text/javascript" src="Editor-1.5.2/js/dataTables.editor.min.js"></script>
<script type="text/javascript" src="Editor-1.5.2/js/editor.bootstrap.min.js"></script>
<script type="text/javascript" src="FixedColumns-3.2.0/js/dataTables.fixedColumns.min.js"></script>
<script type="text/javascript" src="FixedHeader-3.1.0/js/dataTables.fixedHeader.min.js"></script>
<script type="text/javascript" src="KeyTable-2.1.0/js/dataTables.keyTable.min.js"></script>
<script type="text/javascript" src="Responsive-2.0.0/js/dataTables.responsive.min.js"></script>
<script type="text/javascript" src="Responsive-2.0.0/js/responsive.bootstrap.min.js"></script>
<script type="text/javascript" src="RowReorder-1.1.0/js/dataTables.rowReorder.min.js"></script>
<script type="text/javascript" src="Scroller-1.4.0/js/dataTables.scroller.min.js"></script>
<script type="text/javascript" src="Select-1.1.0/js/dataTables.select.min.js"></script>
3个回答

17

我解决了这个问题,方法如下:

    require.config({

    baseUrl: "/MyFrontEnd/resource",

    paths: {
        "jquery": "js/jquery-2.1.4.min",
        "datatables.net": "DataTables-1.10.10/media/js/jquery.dataTables.min",
        "datatables" : "DataTables-1.10.10/media/js/dataTables.bootstrap.min"
        "datatables_select": "DataTables-1.10.10/extensions/Select/js/dataTables.select.min"
    }
});

并且 HTML 页面为:

<script src="../resource`enter code here`/js/require.js"></script>
<script>
require(['/MyFrontEnd/resource/myjs/main.js'], function (main) {
    require(['jquery', 'datatables', 'datatables_select'], function ($, datatables, datatables_select) {
        $(document).ready(function () {
            var table = $('#demo_select').DataTable();
            $('#demo_select').on('click', 'tbody tr', function () {
                if (table.row(this, {selected: true}).any()) {
                    table.row(this).deselect();
                }
                else {
                    table.row(this).select();
                }

                console.log(table.row(this).data());
            });

        });
    });
});

1
有趣的是你是如何让它工作的,这个方法对我也有效。我原本以为解决方案是将路径设置为根目录DataTables文件夹中的datatables.min.js。在该文件中有RequireJS依赖项,包括'datatables'、'datatables.net'、'datatables.net-bs'、'datatables.net-autofill'、'datatables.net-editor'、'datatables-editor-bootstrap'、'datatables.net-buttons'。但最重要的是它能正常工作! - Peter G.

16

我将'datatables'更改为'datatables.net',以满足DataTables自身脚本中的命名要求:define(['jquery', 'datatables.net'],function($) { ...。 我正在尝试组合RequireJS的配置文件,我的最新版本如下:

requirejs.config({
    paths: {
        'jquery': '//ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min',
        'jquery-ui': '//code.jquery.com/ui/1.11.4/jquery-ui',
        'bootstrap': '//maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min',

        //DataTables core
        'datatables' : 'DataTables/datatables.min',
        'datatables.net' : 'DataTables/DataTables-1.10.10/js/jquery.dataTables.min',
        'datatables.net-bs' : 'DataTables/DataTables-1.10.10/js/dataTables.bootstrap.min',

        //Dependencies
        'datatables.net-autofill' : 'DataTables/AutoFill-2.1.0/js/dataTables.autoFill.min',
        'datatables.net-editor' : "DataTables/Editor-1.5.2/js/dataTables.editor.min",
        'datatables-editor-bootstrap' : "DataTables/Editor-1.5.2/js/editor.bootstrap.min",
        'datatables.net-buttons' : 'DataTables/Buttons-1.1.0/js/dataTables.buttons.min',
        //'datatables.net-buttons' : 'DataTables/Buttons-1.1.0/js/buttons.bootstrap.min',

        //Extra modules
        'datatables.net-buttons-bs' : 'DataTables/Buttons-1.1.0/js/buttons.bootstrap.min',
        'datatables.net-colreorder' : "DataTables/ColReorder-1.3.0/js/dataTables.colReorder.min",
        'datatables.net-rowreorder' : "DataTables/RowReorder-1.1.0/js/dataTables.rowReorder.min",
        'datatables.net-scroller' : "DataTables/Scroller-1.4.0/js/dataTables.scroller.min",
        'datatables.net-select' : "DataTables/Select-1.1.0/js/dataTables.select.min",

        //some modules are still missing from the full package...
    },
    shim: {
        'jquery' : {
            exports : 'jquery'
        },
        'bootstrap' : {
            deps : [ 'jquery' ],
            exports : 'Bootstrap'
        },
        'datatables' : {
            deps: ['jquery','bootstrap']  
        },
        'script': {
            deps: ['datatables','datatables.net-colreorder','datatables.net-rowreorder','datatables.net-scroller','datatables.net-select']
        }
    }
});

2
DataTables 1.10.10中没有datatables.min.js。因此,在paths中的以下行似乎不正确:'datatables':'DataTables/datatables.min',。另外,对于调用define的模块来说,使用shim是不正确的。jQuery调用定义。因此,不需要为其使用shim - Louis
非常感谢你,Peter。这是我苦苦挣扎数小时后的最终解决方案。 - Oscar Sortland Kolsrud

14

对我来说,将“.net”模块名称注册为shim配置映射属性下的别名有效:

require.config({
    paths: {
      jquery: '../libs/jquery-2.2.4',
      dataTables: '../libs/dataTables/jquery.dataTables-1.10.12',
      dataTables_buttons: '../libs/dataTables/dataTables.buttons-1.2.2'
    },
    shim: {
      dataTables: {
        deps: ['jquery']
      },
      dataTables_buttons: {
        deps: ['dataTables']
      }
    },
    map: {
      '*': {
        'datatables.net': 'dataTables',
        'datatables.net-buttons': 'dataTables_buttons'
      }
    }
});

这对我也起作用了。布局和语法感觉很正确。我的意思是,使用“map”属性似乎是适当的方法。 - HPWD

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接