Как переопределить библиотечную функцию JQuery (Datatable RowGroup)? - PullRequest
0 голосов
/ 12 февраля 2020

Я довольно новичок в Javascript, и синтаксис определения области действия определенно смущает меня, когда я смотрю на библиотеки с открытым исходным кодом, особенно когда в нем много продвинутых понятий, таких как замыкание, анонимные функции и т. Д. c. Jquery Datatables RowGroup немного глючит с отзывчивостью, поэтому я предпринял смелую попытку написать свою собственную попытку решения.

Ниже приведен соответствующий фрагмент из библиотеки RowGroup , исходный код https://cdn.datatables.net/rowgroup/1.1.1/js/dataTables.rowGroup.js:

/** <Not sure what is going on here!> */
(function (factory) {
    if (typeof define === 'function' && define.amd) {
        // AMD
        define(['jquery', 'datatables.net'], function ($) {
            return factory($, window, document);
        });
    } else if (typeof exports === 'object') {
        // CommonJS
        module.exports = function (root, $) {
            if (!root) {
                root = window;
            }

            if (!$ || !$.fn.dataTable) {
                $ = require('datatables.net')(root, $).$;
            }

            return factory($, root, root.document);
        };
    } else {
        // Browser
        factory(jQuery, window, document);
    }
}(function ($, window, document, undefined) {
    /** </Not sure what is going on here!> */
    'use strict';
    var DataTable = $.fn.dataTable;

    var RowGroup = function (dt, opts) {
        //...
    };
    $.extend(RowGroup.prototype, {
        //...
        _constructor: function () {
            //...
            dt.on('responsive-resize.dt', function () {
                that._adjustColspan();
            });
        },

        /** I would like to override this function, externally */
        _adjustColspan: function () {
            @ @override
        }
    });
}));

Хотя это с открытым исходным кодом вместо того, чтобы изменять библиотеку напрямую, я хотел бы переопределить функцию _adjustColspan из отдельного файла Javascript (который будет включен после этой библиотеки). Это позволит библиотеке по-прежнему обновляться без проблем, и любые пользовательские изменения могут быть легко отслежены.

Итак, во-первых, возможно ли то, что я пытаюсь сделать sh возможным? Если это возможно, как бы я go о переопределении этой функции во внешнем файле. js?

Редактировать: Кажется, что я пытаюсь сделать, придумано " Исправление обезьяны"

1 Ответ

0 голосов
/ 12 марта 2020

Похоже, объект RowGroup происходит от расширения на https://github.com/DataTables/RowGroup/blob/master/js/dataTables.rowGroup.js, которое мы можем прочитать, чтобы увидеть, есть ли какое-то простое место, где мы можем получить ссылку на него ... и там is.

https://github.com/DataTables/RowGroup/blob/master/js/dataTables.rowGroup.js#L418 показывает, что он привязан к $.fn.dataTable.RowGroup, что означает, что мы можем получить его оттуда в любом контексте, в котором есть jQuery.

const RowGroup = $.fn.DataTable.RowGroup;

RowGroup.prototype._adjustColspan = function() {
  // do your own things here
}

(с исходным кодом на https://github.com/DataTables/RowGroup/blob/master/js/dataTables.rowGroup.js#L180 -L184 )

Вы можете проверить это в ваших инструментах разработчика на https://datatables.net/extensions/rowgroup/examples/styling/jqueryui.html, например. Набрав здесь $.fn.DataTable.RowGroup.prototype, мы получим:

{​  
  _adjustColspan: function _adjustColspan()​
  _colspan: function _colspan()​
  _constructor: function _constructor()​
  _draw: function _draw()​
  _group: function _group(b, g)​
  _groupDisplay: function _groupDisplay(b, a)​
  _rowWrap: function _rowWrap(b, g, c)​
  constructor: function h(b, g)​
  dataSrc: function dataSrc(b)​
  disable: function disable()​
  enable: function enable(b)​
  <prototype>: Object { … }
}

И мы можем изменить этот прототип так, как нам хочется.

...