Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 16.07.2016, 23:12
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,125

Сообщение от PMaster
Видимо это происходит при объединении настроек: settings = $.extend(true, {}, defaults, options);
как может вызватся метод обьекта при копировании свойств обьекта?
Ответить с цитированием
  #12 (permalink)  
Старый 17.07.2016, 04:14
Аватар для Erolast
Профессор
Отправить личное сообщение для Erolast Посмотреть профиль Найти все сообщения от Erolast
 
Регистрация: 24.09.2013
Сообщений: 1,436

Цитата:
При инициализации настроек jQuery плагина метод render почему-то запускается
С какой бы стати ему запускаться?
Проверяй код, наверно, где-то еще вызов рендера есть.

Цитата:
Определяется. Я просто из контекста вырвал кусок кода.
Где он там определяется?
Давай полный код.

Последний раз редактировалось Erolast, 17.07.2016 в 04:20.
Ответить с цитированием
  #13 (permalink)  
Старый 17.07.2016, 16:21
Новичок на форуме
Отправить личное сообщение для PMaster Посмотреть профиль Найти все сообщения от PMaster
 
Регистрация: 16.07.2016
Сообщений: 9

Сообщение от Erolast Посмотреть сообщение
С какой бы стати ему запускаться?
Проверяй код, наверно, где-то еще вызов рендера есть.

Первый раз плагин jQuery пишу, не знаю как это возможно, но я просто alert(1) туда вставлял без вызова render() и алерт срабатывал.

Сообщение от Erolast Посмотреть сообщение
Давай полный код.

Хорошо. Вот вызов плагина:

$(document).ready(function () {
    $('#settings_grid').jsGrid({
        dataset: {
            ajaxUrl: '/jsgrid/settings'
        },
        controls: {
            headerCreate: 'Добавить в настройки',
            headerEdit: 'Редактировать',
            isAdd: true,
            isEdit: true,
            isDelete: true,
            pagination: 'double'
        },
        table: {
            limit: 5,
            orderBy: 'id',
            order: 'asc'
        },
        columns: {
            id: {
                name: '',
                isSearch: false,
                isSearchStrict: true,
                isSortable: true,
                render: function (content) {
                    return '<td>' + content.id + '</td>';
                }
            },
            type: {
                name: 'Тип',
                isSearch: false,
                isSearchStrict: false,
                isSortable: true,
                render: function (content) {
                    return '<td>' + content.type + '</td>';
                }
            },
            parameter: {
                name: 'Параметр',
                isSearch: false,
                isSearchStrict: false,
                isSortable: true,
                render: function (content) {
                    return '<td>' + content.parameter + '</td>';
                }
            },
            name: {
                name: 'Имя',
                isSearch: false,
                isSearchStrict: false,
                isSortable: true,
                render: function (content) {
                    return '<td>' + content.name + '</td>';
                }
            },
            value: {
                name: 'Значение',
                isSearch: false,
                isSearchStrict: false,
                isSortable: true,
                render: function (content) {
                    return '<td>' + content.name + '</td>';
                }
            }
        }
    });
});


Полный код плагина:

/*
 * JsGrid 0.0.1
 */

(function ($) {
    var settings,
        ajax,
        dom,
        defaults = {
        dataset: {
            ajaxUrl: null,
        },
        controls: {
            headerCreate: null,
            headerEdit: null,
            isAdd: true,
            isEdit: true,
            isDelete: true,
            pagination: 'bottom',
            perPageOptions: [10, 20, 50, 100, 500],
            totalName: 'Всего: ',
        },
        table: {
            page: 1,
            limit: 50,
            orderBy: 'id',
            order: 'asc',
            searchColumn: null,
            searchValue: null,
        }
    }

     ajax = {
        request: function (url, method, method_hidden, data) {
            // Ajax запрос в контроллер
            data['_method'] = method_hidden;
            if (method == 'post') {
                return $.post(url, data);
            }
            else {
                return $.get(url, data);
            }
        },
        index: function (settings) {
            // Метод контроллера index
            return this.request(settings.dataset.ajaxUrl, 'get', 'get', settings);
        },
        create: function (settings) {
            // Метод контроллера create
            return this.request(settings.dataset.ajaxUrl + '/create', 'get', 'get', settings);
        },

        store: function (settings) {
            // Метод контроллера store
            return this.request(settings.dataset.ajaxUrl, 'post', 'post', settings);
        },

        edit: function (settings) {
            // Метод контроллера edit
            return this.request(settings.dataset.ajaxUrl + '/' + settings.id + '/edit', 'get', 'get', settings);
        },

        update: function (settings) {
            // Метод контроллера update
            return this.request(settings.dataset.ajaxUrl + '/' + settings.id, 'post', 'put', settings);
        },

        destroy: function (settings) {
            // Метод контроллера destroy
            return this.request(settings.dataset.ajaxUrl + '/' + settings.id, 'post', 'delete', settings);
        }
    };

    dom = {
        render: function (container, settings) {
            // Отображение данных
            var request = ajax.index(settings);
            request.done(function (result) {
                // Элементы управления
                var html = '<div>' + settings.controls.totalName + result.total + '</div>';

                // Таблица
                html += '<div class="table-responsive"><table class="table">';

                // Заголовки
                html += '<tr>';
                for (var column in settings.columns) {
                    html += '<th>' + settings.columns[column].name + '</th>'
                }
                html += '<th></th></tr>';

                // Контент
                for (var row = 0; row < result.rows.length; row++) {
                    html += '<tr data-id="' + result.rows[row].id + '">';
                    for (var column in result.rows[row]) {
                        // html += '<td>' + result[row][column] + '</td>'
                        html += settings.columns[column].render(result.rows[row]);
                    }
                    html += '<td>';
                    if (settings.controls.isEdit) html += '<a href="#" class="jsgrid-edit"><i class="ficon-cog"></i></a>';
                    if (settings.controls.isDelete) html += '<a href="#" class="jsgrid-delete"><i class="ficon-cancel"></i></a>';
                    html += '</td></tr>';
                }
                html += '</table></div>';
                container.append(html);
            });
        },
        handlers: function (container, settings) {
            container.on('click', '.jsgrid-delete', function (e) {
                e.preventDefault();
                settings.id = $(this).closest('tr').attr('data-id');
                var request = ajax.destroy(settings);
                request.done(function (result) {

                });
            });
        }
    }

    $.fn.jsGrid = function (options) {
        // Если плагин ещё не проинициализирован
        if (!this.data('jsgrid')) {
            settings = $.extend(true, {}, defaults, options);
            this.data('jsgrid', settings);
            // Обработчики событий
            dom.handlers(this, settings);
        }
        else settings = this.data('jsgrid');

        dom.render(this, settings);
    }

})(jQuery);
Ответить с цитированием
  #14 (permalink)  
Старый 17.07.2016, 18:09
Аватар для destus
Профессор
Отправить личное сообщение для destus Посмотреть профиль Найти все сообщения от destus
 
Регистрация: 18.05.2011
Сообщений: 1,207

PMaster,
Нужно всего лишь научиться дебажиться. На строке 2 запускается jsGrid плагина, далее он собирается какие-то настройки и запускает метод dom.render, передавая туда контекст и эти самые настройки. На строке 77 запускается какой-то get запрос, и в этот самый $.get вторым параметром попадает объект настроек, среди которых есть функции. Далее мы сходу попадаем сюда http://s33.radikal.ru/tempfiles/23e5.../-88693455.png и видим комментарий: если значение - функция, то она запускается и её результат возвращается. Теперь мы попадаем на строку 26 и вылетаем с ошибкой.
Ответить с цитированием
  #15 (permalink)  
Старый 17.07.2016, 20:25
Новичок на форуме
Отправить личное сообщение для PMaster Посмотреть профиль Найти все сообщения от PMaster
 
Регистрация: 16.07.2016
Сообщений: 9

Сообщение от destus Посмотреть сообщение
PMaster,
На строке 77 запускается какой-то get запрос, и в этот самый $.get вторым параметром попадает объект настроек, среди которых есть функции. Далее мы сходу попадаем сюда http://s33.radikal.ru/tempfiles/23e5.../-88693455.png и видим комментарий: если значение - функция, то она запускается и её результат возвращается. Теперь мы попадаем на строку 26 и вылетаем с ошибкой.
Спасибо. Теперь ясно. В ajax запрос нужно передавать только данные. Я для простоты весь объект настроек ему давал, поэтому render запускался сам по себе.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как вызвать метод? ibolgenos Общие вопросы Javascript 22 20.09.2014 00:04
Как вызвать функцию из переменной? sss2019 Общие вопросы Javascript 7 02.09.2014 13:34
как вызвать анонимную функцию которая находится в подключенном файле(.js) arsen97 Общие вопросы Javascript 3 03.08.2014 00:23
Управление скроллом "а-ля тач" HonesT Элементы интерфейса 2 27.08.2013 14:25
Как вызвать функцию из функции ? PheonixS AJAX и COMET 7 20.06.2010 09:51