не могу прочитать свойство addWidget из неопределенного с JSON и гридстек - PullRequest
0 голосов
/ 21 января 2019

Я столкнулся с проблемой при попытке создать тире гридстака

Я получаю «Uncaught TypeError: Невозможно прочитать свойство addWidget of undefined» при попытке загрузить страницу .. (код основан набазовая демоверсия сериализованного гридстака https://github.com/gridstack/gridstack.js/blob/develop/demo/serialization.html)

Мой измененный раздел сценария

    <script type="text/javascript">
    $(function() {
        var options = {};
        $('.grid-stack').gridstack(options);
        new function() {

            this.grid = $('.grid-stack').data('gridstack');

            this.loadGrid = function() {
                this.grid.removeAll();
                debugger;
                const URL = `//${window.location.hostname}/dashboard/getDashboard`;
                $.getJSON(URL, function(items) {
                    _.each(items, function(node) {
                        this.grid.addWidget($('<div><div class="grid-stack-item-content" /></div>'),
                            node.x, node.y, node.width, node.height, true, 4, 12, 1, 8, node.id);
                    }.bind(this));
                });
                return false;
            }.bind(this);

            this.saveGrid = function() {
                this.serializedData = _.map($('.grid-stack > .grid-stack-item:visible'), function(el) {
                    el = $(el);
                    var node = el.data('_gridstack_node');
                    return {
                        x: node.x,
                        y: node.y,
                        width: node.width,
                        height: node.height
                    };
                });
                $('#saved-data').val(JSON.stringify(this.serializedData, null, '    '));
                return false;
            }.bind(this);

            this.clearGrid = function() {
                this.grid.removeAll();
                return false;
            }.bind(this);
            $('#save-grid').click(this.saveGrid);
            $('#load-grid').click(this.loadGrid);
            $('#clear-grid').click(this.clearGrid);
            this.loadGrid();
        };
    });
</script>

Есть предложения? Я пробовал несколько вещей, но продолжаю тупиковать

Лучшее, что я могу понять, это this.grid исчезает, когда я вхожу в getJSON

Данные загружаются нормально Кстати, я вижу items, заполненный данными, которые я ожидаю.

1 Ответ

0 голосов
/ 22 января 2019

Кажется, что контекст этого в методе loadGrid может быть неправильным, попробуйте изменить его следующим образом:

this.loadGrid = function () {
  this.grid.removeAll();
  debugger;
  const URL = `//${window.location.hostname}/dashboard/getDashboard`;
  const context = this;
  $.getJSON(URL, function (items) {
    _.each(items, function (node) {
      context.grid.addWidget($('<div><div class="grid-stack-item-content" /></div>'),
        node.x, node.y, node.width, node.height, true, 4, 12, 1, 8, node.id);
    }.bind(this));
  });
  return false;
}.bind(this);

Если вы не используете правильный контекст, this будет ссылатьсяк чему-то еще внутри этих вложенных функций, либо $ или _ возможно.

...