Как мне обновить таблицу Backgrid новыми данными?
У меня есть представление Backgrid на моей странице с набором данных. Над представлением Backgrid находится другое представление, называемое "фильтрами", которое позволяет пользователю изменять диапазон дат для данных, чтобы они могли видеть результаты между двумя датами.
Я не уверен, что самый чистый способ - обновить содержимое представления Backgrid. Вот мой код в его нынешнем виде:
// Fetch data
var fetchingOrders = CRM.request("orders:entities");
// Create layout
var ordersLayout = new List.OrdersLayout();
$.when(fetchingOrders).done(function (orders) {
var ClickableRow = Backgrid.Row.extend({
events: {
"click" : "rowClicked"
},
rowClicked: function () {
CRM.trigger("order:show", this.model.get("RecordID"));
}
});
var customersListView = new Backgrid.Grid({
row: ClickableRow,
columns: CRM.settings.columns.orders,
collection: orders,
className: "simple-table backgrid"
});
var filters = new List.Filters({});
filters.on("orders:filter", function (startdate, enddate) {
});
ordersLayout.on("show", function () {
ordersLayout.filters.show(filters);
ordersLayout.backgrid.show(customersListView);
});
CRM.mainRegion.show(ordersLayout);
});
CRM.request("orders:entities")
строка использует эту функцию:
getOrders: function (startdate, enddate) {
var orders = new Entities.Orders();
var defer = $.Deferred();
orders.fetch({
data: {
action: "search",
dateRangeColumn: "RecordDate",
startDate: startdate || "2013-11-06",
endDate: enddate || "2013-11-06",
// startDate: startdate || Utilities.currentDate,
// endDate: enddate || Utilities.currentDate
},
success: function (data) {
defer.resolve(data);
},
error: function (collection, response, options) {
console.log(response);
console.log("Error loading Orders…");
}
});
return defer.promise();
},
Вы могли заметить filters.on("orders:filter", function (startdate, enddate) {
блок. Я запускаю это каждый раз, когда пользователь меняет дату начала или окончания в filters
вид, но я не уверен, что делать отсюда, потому что мне по сути нужно перезапустить весь приведенный выше код для установки.
Предложения? Спасибо!
1 ответ
Я бы посоветовал вам разделить части настройки и выборки данных. Что-то вроде:
var ordersLayout = new List.OrdersLayout();
var ClickableRow = Backgrid.Row.extend({
events: {
"click" : "rowClicked"
},
rowClicked: function () {
CRM.trigger("order:show", this.model.get("RecordID"));
}
});
var customersListView = new Backgrid.Grid({
row: ClickableRow,
columns: CRM.settings.columns.orders,
// don't set the collection here (see below)
// collection: orders,
className: "simple-table backgrid"
});
var updateData = function(startDate, endDate){
var fetchingOrders = CRM.request("orders:entities");
$.when(fetchingOrders).done(function (orders) {
// update collection reference
customersListView.collection = orders;
// rerender the view
customersListView.render();
});
};
var filters = new List.Filters({});
filters.on("orders:filter", function (startdate, enddate) {
// call the function updating the data each time the filter criteria change
updateData(startdate, enddate);
});
// initially call the data update method once with the default params to display
// the initial data set
updateData("2013-04-28", "2013-09-29");
ordersLayout.on("show", function () {
ordersLayout.filters.show(filters);
ordersLayout.backgrid.show(customersListView);
});
Я надеюсь, что это, по крайней мере, приведет вас в правильном направлении!