Saya memperbarui aplikasi saya untuk menggunakan Webpack 2. Meskipun ngtable berfungsi dengan baik jika dimuat dengan webpack 1, saya mengalami masalah saat memuat dengan webpack 2.
Konsol browser menampilkan GET http://app.finderbox.dev/app/ng-table/pager.html 404 (Not Found)
. Dalam komponen yang memuat tabel, saya menetapkan beberapa keluaran log:
$templateCache.get('http://app.finderbox.dev/app/ng-table/pager.html'): undefined
$templateCache.get('http://app.finderbox.dev/ng-table/pager.html'): undefined
$templateCache.get('ng-table/pager.html'): Promise {$$state: Object}
Tampaknya ngtable memuat templat dengan ID yang berbeda.
@TheLarkInn : apakah menurut Anda itu bisa menjadi kesalahan di sisi webpack?
@faceleg : apakah itu terkait dengan masalah Anda https://github.com/esvit/ng-table/issues/957 ?
Masalah ini adalah duplikat yang jauh lebih jelas dijelaskan dari https://github.com/esvit/ng-table/issues/957 Saya pikir: D
Solusi bagi saya adalah meletakkan templat di cache secara manual.
Saya mengambil bagian yang dihasilkan webpack dari ng-table.js dan memasukkannya ke dalam fungsi bootstrap saya. Anehnya output $templateCache.get('ng-table/pager.html')
di console.log sekarang adalah string template daripada janji.
/* 42 */
/* unknown exports provided */
/*!********************************!*\
!*** ./src/browser/pager.html ***!
\********************************/
/***/ function(module, exports, __webpack_require__) {
var path = 'ng-table/pager.html';
var html = "<div class=\"ng-cloak ng-table-pager\" ng-if=\"params.data.length\">\n <div ng-if=\"params.settings().counts.length\" class=\"ng-table-counts btn-group pull-right\">\n <button ng-repeat=\"count in params.settings().counts\" type=\"button\"\n ng-class=\"{'active':params.count() == count}\"\n ng-click=\"params.count(count)\" class=\"btn btn-default\">\n <span ng-bind=\"count\"></span>\n </button>\n </div>\n <ul ng-if=\"pages.length\" class=\"pagination ng-table-pagination\">\n <li class=\"page-item\" ng-class=\"{'disabled': !page.active && !page.current, 'active': page.current}\" ng-repeat=\"page in pages\" ng-switch=\"page.type\">\n <a class=\"page-link\" ng-switch-when=\"prev\" ng-click=\"params.page(page.number)\" href=\"\">«</a>\n <a class=\"page-link\" ng-switch-when=\"first\" ng-click=\"params.page(page.number)\" href=\"\"><span ng-bind=\"page.number\"></span></a>\n <a class=\"page-link\" ng-switch-when=\"page\" ng-click=\"params.page(page.number)\" href=\"\"><span ng-bind=\"page.number\"></span></a>\n <a class=\"page-link\" ng-switch-when=\"more\" ng-click=\"params.page(page.number)\" href=\"\">…</a>\n <a class=\"page-link\" ng-switch-when=\"last\" ng-click=\"params.page(page.number)\" href=\"\"><span ng-bind=\"page.number\"></span></a>\n <a class=\"page-link\" ng-switch-when=\"next\" ng-click=\"params.page(page.number)\" href=\"\">»</a>\n </li>\n </ul>\n</div>\n";
var angular = __webpack_require__(/*! angular */ 0);
angular.module('ng').run(['$templateCache', function(c) { debugger; c.put(path, html) }]);
module.exports = path;
@faceleg FYI
Bagaimana pengaruhnya terhadap ukuran bundel?
Saya memiliki masalah yang sama dengan beberapa template html yang hilang saat menggunakan ngTable dengan Webpack 2.2. Mengimpor modul ngTable dari direktori /bundles tampaknya berfungsi dengan baik. Tapi ini lebih seperti solusi untuk saat ini kurasa.
import { ngTableModule } from 'ng-table/bundles/ng-table';
angular.module('myapp', [
ngTableModule.name
]);
Terima kasih @Boosten , ini berhasil untuk saya (typescript membencinya)
Saya memiliki masalah ini juga.
Saya akhirnya menyalin file html dan memfilter folder dari 'ng-table/src/browser'
ke folder tabel-ng di webroot saya '~/ng-table/'
Tidak menggunakan webpack, menggunakan TypeScript tanpa modul. Pada dasarnya hanya aplikasi ES5 yang dikompilasi. (Masih mencoba mencari cara untuk mendapatkan pengetikan untuk didaftarkan dalam proyek non-modul ketika mereka tidak global atau di luar direktori @types karena saya tidak dapat menggunakan impor)
Juga, 'ng-table/src/browser/date.html'
hilang.
Saya menginstal ng-table dari npm dan ini adalah versi 3.0.1
Saya berhasil memuat template tanpa langkah manual apa pun, dengan mengonfigurasi Webpack dengan yang berikut ini di file webpack.config.js saya (menggunakan Webpack 3.11.0):
module: {
rules: [
// ...
{ test: /ng-table\/.*\.html$/, use: ['ngtemplate-loader?requireAngular&relativeTo=/src/browser/&prefix=ng-table/', 'html-loader'] }
]
}
Ini juga membutuhkan paket NPM ngtemplate-loader
dan html-loader
untuk diinstal; setelah selesai, konfigurasi ini akan berfungsi apa adanya untuk orang lain yang menggunakan Webpack 3.x. (Untuk Webpack 2.x atau 4.x, baris serupa akan berfungsi tetapi mungkin di bagian berbeda dari file konfigurasi Webpack). Ini menyebabkan Webpack mengkompilasi template ke dalam file vendor.bundle.js
sebagai berikut:
/* 570 */
/***/ (function(module, exports, __webpack_require__) {
// Module
var code = "<div class=\"ng-cloak ng-table-pager\" ng-if=\"params.data.length\"> <div ng-if=\"params.settings().counts.length\" class=\"ng-table-counts btn-group pull-right\"> <button ng-repeat=\"count in params.settings().counts\" type=\"button\" ng-class=\"{'active':params.count() == count}\" ng-click=\"params.count(count)\" class=\"btn btn-default\"> <span ng-bind=\"count\"></span> </button> </div> <ul ng-if=\"pages.length\" class=\"pagination ng-table-pagination\"> <li class=\"page-item\" ng-class=\"{'disabled': !page.active && !page.current, 'active': page.current}\" ng-repeat=\"page in pages\" ng-switch=\"page.type\"> <a class=\"page-link\" ng-switch-when=\"prev\" ng-click=\"params.page(page.number)\" href=\"\">«</a> <a class=\"page-link\" ng-switch-when=\"first\" ng-click=\"params.page(page.number)\" href=\"\"><span ng-bind=\"page.number\"></span></a> <a class=\"page-link\" ng-switch-when=\"page\" ng-click=\"params.page(page.number)\" href=\"\"><span ng-bind=\"page.number\"></span></a> <a class=\"page-link\" ng-switch-when=\"more\" ng-click=\"params.page(page.number)\" href=\"\">…</a> <a class=\"page-link\" ng-switch-when=\"last\" ng-click=\"params.page(page.number)\" href=\"\"><span ng-bind=\"page.number\"></span></a> <a class=\"page-link\" ng-switch-when=\"next\" ng-click=\"params.page(page.number)\" href=\"\">»</a> </li> </ul> </div> ";
// Exports
var _module_exports = code;;
var path = 'ng-table/pager.html';
var angular = __webpack_require__(0);
angular.module('ng').run(['$templateCache', function(c) { c.put(path, _module_exports) }]);
module.exports = path;
/***/ }),
Perhatikan bagaimana jalannya ng-table/pager.html
. Bagian relativeTo=/src/browser/
dari konfigurasi Webpack mengubah node_modules/ng_table/src/browser/pager.html
menjadi pager.html
, dan kemudian prefix=ng-table/
menambahkan awalan ng-table
ke nama yang ngtemplate- loader mengkompilasinya dengan. Ini menghasilkan cache template Angular yang dimuat sebelumnya dengan template ng-table/pager.html
, dan ketika kode ng-table meminta template ng-table/pager.html
, Angular menemukannya dan menampilkannya dengan benar.
Komentar yang paling membantu
Saya memiliki masalah yang sama dengan beberapa template html yang hilang saat menggunakan ngTable dengan Webpack 2.2. Mengimpor modul ngTable dari direktori /bundles tampaknya berfungsi dengan baik. Tapi ini lebih seperti solusi untuk saat ini kurasa.