2017-02-22 29 views
0

Я изучаю Backbone.js и использую BackGrid для визуализации данных и предоставления конечному пользователю способа редактировать записи на веб-сайте Microsoft MVC. Для целей этой тестовой сетки я использую модель поставщика. BackGrid делает данные редактируемыми по умолчанию (что хорошо для моей цели). Я добавил к моему JavaScript следующий JavaScript.Сохранение Только измененная запись в сетке BackGrid?

var Vendor = Backbone.Model.extend({ 
 
    initialize: function() { 
 
     Backbone.Model.prototype.initialize.apply(this, arguments); 
 
     this.on("change", function (model, options) { 
 
      if (options && options.save === false) return; 
 
      model.url = "/Vendor/BackGridSave"; 
 
      model.save(); 
 
     }); 
 
    } 
 

 
}); 
 

 
var PageableVendors = Backbone.PageableCollection.extend(
 
{ 
 
    model: Vendor, 
 
    url: "/Vendor/IndexJson", 
 
    state: { 
 
     pageSize: 3 
 
    }, 
 
    mode: "client" // page entirely on the client side. 
 

 
}); 
 

 
var pageableVendors = new PageableVendors(); 
 
//{ data: "ID" }, 
 
//{ data: "ClientID" },   
 
//{ data: "CarrierID" }, 
 
//{ data: "Number" }, 
 
//{ data: "Name" }, 
 
//{ data: "IsActive" } 
 

 

 
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: "ClientID", 
 
     label: "ClientID", 
 
     cell: "integer" // An integer cell is a number cell that displays humanized integers 
 
    }, { 
 
     name: "CarrierID", 
 
     label: "CarrierID", 
 
     cell: "number" // A cell type for floating point value, defaults to have a precision 2 decimal numbers 
 
    }, { 
 
     name: "Number", 
 
     label: "Number", 
 
     cell: "string" 
 
    }, { 
 
     name: "Name", 
 
     label: "Name", 
 
     cell: "string" 
 
    }, 
 
    { 
 
     name: "IsActive", 
 
     label: "IsActive", 
 
     cell: "boolean" 
 
    } 
 
]; 
 

 
// initialize a new grid instance. 
 
var pageableGrid = new Backgrid.Grid({ 
 
    columns: [ 
 
    { 
 
     name:"", 
 
     cell: "select-row", 
 
     headercell: "select-all" 
 
    }].concat(columns), 
 
    collection: pageableVendors 
 
}); 
 

 
// render the grid. 
 
var $p = $("#vendor-grid").append(pageableGrid.render().el); 
 

 
// Initialize the paginator 
 
var paginator = new Backgrid.Extension.Paginator({ 
 
    collection: pageableVendors 
 
}); 
 

 
// Render the paginator 
 
$p.after(paginator.render().el); 
 

 

 
// Initialize a client-side filter to filter on the client 
 
// mode pageable collection's cache. 
 
var filter = new Backgrid.Extension.ClientSideFilter({ 
 
    collection: pageableVendors, 
 
    fields: ['Name'] 
 
}); 
 

 
// REnder the filter. 
 
$p.before(filter.render().el); 
 

 
//Add some space to the filter and move it to teh right. 
 
$(filter.el).css({ float: "right", margin: "20px" }); 
 

 
// Fetch some data 
 
pageableVendors.fetch({ reset: true });
@{ 
 
    ViewBag.Title = "BackGridIndex"; 
 
} 
 

 
<h2>BackGridIndex</h2> 
 

 
<div id="vendor-grid"></div> 
 

 
@section styles { 
 
    @Styles.Render("~/Scripts/backgrid.css") 
 
    @Styles.Render("~/Scripts/backgrid-select-all.min.css") 
 
    @Styles.Render("~/Scripts/backgrid-filter.min.css") 
 
    @Styles.Render("~/Scripts/backgrid-paginator.min.css") 
 

 
} 
 

 
@section scripts { 
 

 
    @Scripts.Render("~/Scripts/underscore.min.js") 
 
    @Scripts.Render("~/Scripts/backbone.min.js") 
 
    @Scripts.Render("~/Scripts/backgrid.js") 
 
    @Scripts.Render("~/Scripts/backgrid-select-all.min.js") 
 
    @Scripts.Render("~/Scripts/backbone.paginator.min.js") 
 
    @Scripts.Render("~/Scripts/backgrid-paginator.min.js") 
 
    @Scripts.Render("~/Scripts/backgrid-filter.min.js") 
 
    @Scripts.Render("~/Scripts/Robbys/BackGridIndex.js") 
 

 
}

Когда пользователь редактирует строку, он успешно срабатывает хиты метода model.Save() и передает модель для сохранения действий, в этом случае BackGridSave и успешно сохраняет запись, которая изменилась, но, похоже, сохраняет всех поставщиков в модели, когда изменился только один из поставщиков. Есть ли способ от JavaScript/Backbone.js/BackGrid, чтобы передать только одного поставщика - поставщика, который изменился?

Обновление: я понял, что он не отправляет каждого поставщика, но он отправляет одного и того же поставщика несколько раз, как если бы событие изменения срабатывало несколько раз.

+0

«сохранить всех поставщиков в модели» - как правило, в Backbone модель представляет собой одну запись, а Collection представляет собой набор записей. Возможно, вам нужно использовать коллекцию, а не модель. – mikeapr4

+0

Вам не нужно вызывать инициализацию родительского элемента 'Backbone.Model.prototype.initialize.apply (this, arguments);' потому что цель инициализации должна быть переопределена. –

+1

Также, пожалуйста, укажите [mcve]. –

ответ

1

Думаю, я ответил на свой вопрос. Ну, по крайней мере, я получаю желаемый результат. Я только что добавил вызов после первого. Похоже, это было бы необязательно.

var Vendor = Backbone.Model.extend({ 
initialize: function() { 
    Backbone.Model.prototype.initialize.apply(this, arguments); 
    this.on("change", function (model, options) { 
     if (options && options.save === false) return; 
     model.url = "/Robbys/BackGridSave"; 
     model.save(); 
     model.off("change", null, this); // prevent the change event from  being triggered many times. 



    }); 
} 

});