Я обновлял приложение Symfony с 3.4
до 4.2.2
, все в порядке, но я не могу заставить DataTables функционировать через установку пряжи и на веб-упаковке с angular-datatables .
Как я это настроил
Установка пряжи :
yarn add jquery@2.1.4
yarn add angular@1.4.8
yarn add datatables.net@1.10.19
yarn add datatables.net-dt@1.10.11
yarn add angular-datatables@0.6.2
Добавил эти файлы в мой веб-пакет app.js
вместе с jQuery:
var $ = require('jquery');
require('datatables.net');
require('datatables.net-dt');
require('angular');
require('angular-datatables');
Содержит app.js
внутри моего файла конфигурации Webpack:
var Encore = require('@symfony/webpack-encore');
Encore
.setOutputPath('public/build/')
.setPublicPath('/build')
.addEntry('app', './assets/js/app.js')
.enableSingleRuntimeChunk()
.cleanupOutputBeforeBuild()
.enableBuildNotifications()
.enableSourceMaps(!Encore.isProduction())
.enableVersioning(Encore.isProduction())
.autoProvidejQuery()
;
module.exports = Encore.getWebpackConfig();
и включил вышеупомянутое в мой внешний интерфейс через:
{{ encore_entry_script_tags('app') }}
Ошибка
Вышеуказанное приводит к следующей ошибке Javascript, которая, по-видимому, показывает, что API DataTables недоступен.
Uncaught TypeError: Cannot read property 'Api' of undefined
at initAngularDataTables (angular-datatables.js:478)
at Object.invoke (angular.js:4523)
/* @ngInject */
function initAngularDataTables() {
if ($.fn.DataTable.Api) {
/**
* Register an API to destroy a DataTable without detaching the tbody so that we can add new data
* when rendering with the "Angular way".
*/
$.fn.DataTable.Api.register('ngDestroy()', function(remove) {
remove = remove || false;
Возможное решение
Я попробовал следующее хакерское исправление, но это значит, что мой Angular-код должен быть в том же файле app.js, иначе он не будет работать. Это также означает, что некоторые функции все еще не работают ...
global.$ = global.jQuery = require('jquery');
require('jquery-ui');
require('bootstrap');
require('admin-lte');
require('datatables.net-dt');
global.moment = require('moment');
$.fn.dataTable = $.fn.DataTable = global.DataTable = require('datatables.net');
Error
TypeError: _oTable.ngDestroy is not a function
at _destroyAndCompile (angular-datatables.js:947)