Событие обновления магистрали (синхронизации)

Это второй раз, когда я задаю этот вопрос, в первый раз текст был запутан для понимания, извините за это. Вот этот же вопрос улучшен и лучше всего объяснен.

У меня есть PageableCollection, данные загружаются без проблем! Строки таблицы (я использую backgrid, расширение для магистрали) доступны для редактирования!! НО после редактирования и нажатия кнопки ввода ничего не происходит! Сервер не вызывается, я жду некоторого вызова ajax для сервера, но этого не происходит.

Я нахожу способ переопределить синхронизацию, но я действительно не знаю, что я хочу сделать, чтобы сделать вызов после редактирования и сказать "хорошо" или "ошибка обновления".

код ниже:

var Territory = Backbone.Model.extend({});

var PageableTerritories = Backbone.PageableCollection.extend({
    model: Territory,
    url: "linhas/results",
    state: {
        pageSize: 9
    },
    mode: "client",
    sync: function (method, model, options){
        return Backbone.sync(method, model, options);
    }
});


var pageableTerritories = new PageableTerritories(),
    initialTerritories = pageableTerritories;

function createBackgrid(collection){
    var columns = [{
        name: "id", // The key of the model attribute
        label: "ID", // The name to display in the header
        editable: false, // By default every cell in a column is editable, but *ID* shouldn't be
        // Defines a cell type, and ID is displayed as an integer without the ',' separating 1000s.
        cell: Backgrid.IntegerCell.extend({
            orderSeparator: ''
        })
    }, {
        name: "name",
        label: "Name",
        // The cell type can be a reference of a Backgrid.Cell subclass, any Backgrid.Cell subclass instances like *id* above, or a string
        cell: "string" // This is converted to "StringCell" and a corresponding class in the Backgrid package namespace is looked up
    }, {
        name: "pop",
        label: "Population",
        cell: "integer" // An integer cell is a number cell that displays humanized integers
    }, {
        name: "url",
        label: "URL",
        cell: "uri" // Renders the value in an HTML <a> element
    }];
    if ($(window).width() < 768){
        //okendoken. removing URL-column for screens smaller than 768px
        columns.splice(3,1)
    }
    var pageableGrid = new Backgrid.Grid({
        columns: columns,
        collection: collection,
        footer: Backgrid.Extension.Paginator.extend({
            //okendoken. rewrite template to add pagination class to container
            template: _.template('<tr><td colspan="<%= colspan %>"><ul class="pagination"><% _.each(handles, function (handle) { %><li <% if (handle.className) { %>class="<%= handle.className %>"<% } %>><a href="#" <% if (handle.title) {%> title="<%= handle.title %>"<% } %>><%= handle.label %></a></li><% }); %></ul></td></tr>')
        }),
        className: 'table table-striped table-editable no-margin'
    });
    $("#table-dynamic").html(pageableGrid.render().$el);


}

1 ответ

Решение

Вам необходимо активировать сохранение после редактирования ячейки. Это можно сделать, просто прослушав событие изменения вашей модели территории. Я использовал следующее:

var MyModel = Backbone.Model.extend({
    initialize : function() {
        this.on('change', function(model, options) {
            // Prevent save on update
            if (options.save === false)
                return;

            model.save(_.clone(model.attributes), {});
        });
    },
    // Process and remove model unrelated stuff from server response
    parse : function(resp, options) {
        // pure model fetch
        if (!resp.data && !resp.notifications)
            return resp;

        // process notifications
        if (resp.notifications && resp.notifications.length)
            processNotifications(resp.notifications);

        return resp.data || {};
    },
    rollBack : function() {
        // Rollback to old data
        this.set(this.previousAttributes(), {save: false});
        // Trigger cell rendering
    },
    save : function(attrs, options) {
        options || (options = {});

        options.success = function(model, resp, options) {
            // Show optional success messages here if needed and
            // not in response from server
        };

        options.error = function(model, xhr, options) {
            var resp = JSON.parse(xhr.responseText);
            model.parse(resp, options);
            // Rollback to old data
            model.rollBack();
            model.trigger('backgrid:error');
        };

        // We get the correct data back from the server - prevent multiple saves
        options.save = false;
        options.data = JSON.stringify(attrs);

        Backbone.Model.prototype.save.call(this, attrs, options);
    }
});

Эта реализация получает все уведомления от сервера (в случае успеха обратной связи нет). Следовательно, уведомления фильтруются в методе model.parse. Если есть уведомления, данные находятся в свойствах данных ответа. Однако, если вы показываете обратную связь от js, реализуйте ее в options.success и options.error

Другие вопросы по тегам