【问题标题】:sum footer in backgridjsbackgridjs中的总和页脚
【发布时间】:2023-03-30 10:27:01
【问题描述】:

我在下面有一个 backgridjs 表。

var columns = [{
    name: "_id",
    label: "account#",
    editable:"false",
    cell: "string"
  }, {
    name: "class",
    label: "class",
    editable:"false",
    cell: "string"
  },{
    name: "date",
    label: "Date",
    editable:"false",
    cell: "string"
  },{
    name: "id",
    label: "id",
    editable:"false",
    cell: "string"
  },{
    name: "total",
    label: "Total",
    editable:"false",
    cell: Backgrid.NumberCell.extend({
      orderSeparator: ','
    }),
    cell: "number"
  }];

var PageableTerritories = Backbone.PageableCollection.extend({
  model: Territory,
  url: "/payroll",
  state: {
    pageSize: 15
  },
  mode: "client" // page entirely on the client side
});

var pageableTerritories = new PageableTerritories();

var CaptionFooter = Backgrid.Footer.extend({
  render: function () {
    this.el.innerHTML = '<tr><td></td><td></td></tr>'
    return this;
  }
});

// Set up a grid to use the pageable collection
var pageableGrid = new Backgrid.Grid({
  columns: [{
    // enable the select-all extension
    name: "",
    cell: "select-row",
    headerCell: "select-all",
  }].concat(columns),
  collection: pageableTerritories,
  footer: CaptionFooter // <--
});

// Render the grid
var $example1 = $("#example-1-result");
$example1.append(pageableGrid.render().el)

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

// Render the paginator
$example1.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: pageableTerritories,
  fields: ['_id',"Order Class","techId"],
  placeholder: "search"
});

// Render the filter
$example1.before(filter.render().el);

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

// Fetch some data
pageableTerritories.fetch({reset: true});

一切正常,如预期的那样,除了我很难弄清楚如何为总列设置总页脚单元格。

如果我在控制台中键入下面的命令,我会得到我想要的页脚单元格。

for (var i = 0,total = 0, len = pageableTerritories.toJSON().length; i < len; ++i) {
  total = total + pageableTerritories.toJSON()[i].total;
  $('tfoot').text(total)
};

但我希望在表格呈现时显示页脚单元格。我尝试了以下但总显示 $0。

var CaptionFooter = Backgrid.Footer.extend({

  render: function () {
   for (var i = 0,total = 0, len = pageableTerritories.toJSON().length; i < len; ++i) {
      total = total + pageableTerritories.toJSON()[i].total;
      $('tfoot').text(total)
    };
    this.el.innerHTML = '<tr><td></td><td></td></tr>' + total <---- $0 here
    return this;
  }

});

如果有人能帮我解决这个问题,我将不胜感激。像往常一样提前感谢。

【问题讨论】:

  • 您能否在jsfiddle.net上提供样品
  • 我很难让我的代码在 jsfiddle 上运行。我尝试了这个,它与jsfiddle.net/fpena06/YNy6S 非常相似,并且页脚有效。但我的原始代码没有
  • 我认为我的问题与我的脚本加载有关,但我什至不知道如何开始调试。我的页面正文中有 。这是正文标记中的最后一个脚本,当我复制代码并将其粘贴到控制台时,它只处理 $("tr").click 和 console.log('clicked') ,但不是简单地加载页面。谢谢

标签: javascript json backbone.js backgrid


【解决方案1】:

这解决了我的页脚总数问题,但是当我对页脚总数进行分页时,页脚总数不会更新。

var PageableTerritories = Backbone.PageableCollection.extend({
  model: Territory,
  url: "/payroll",
  total: function() {
      return this.reduce(function(memo, value) {
        return memo + value.get("total");
      }, 0);
    },
  state: {
    pageSize: 15
  },
  mode: "client" // page entirely on the client side
});

var CaptionFooter = Backgrid.Footer.extend({
    initialize: function() {
      _.bindAll(this);
      this.collection.bind('sync', this.total);
    },
    total: function(evt) {
      var total = evt.total()
      this.$el.html("<tr><td colspan='7' class='text book bold align right'>Gross Pay: $" + total + "</td></tr>");
    }
  });

【讨论】:

【解决方案2】:

看看这个 Backgridjs 页脚周围的简单包装器,以提供总计页脚。

https://bitbucket.org/base79/backgridjs-total-footer/overview

对于您的示例,更新列以包括:

var columns = [{
    ...
    {
        name: 'total',
        label: 'Total',
        ...
        footerCell: TotalFooter.Cell.extend({
            getValue: function () {
                return '$' + this.formatter.fromRaw(this._sumColumn());
            }
    })
}];

那么pageableGrid就变成了:

var pageableGrid = new Backgrid.Grid({
  columns: [{
    // enable the select-all extension
    name: "",
    cell: "select-row",
    headerCell: "select-all",
  }].concat(columns),
  collection: pageableTerritories,
  footer: TotalFooter.Footer
});

【讨论】:

  • 对不起,我收到了错误。 fromRaw 未定义。
  • @fpena06 现在已根据this commit 修复此问题。问题是全选扩展没有格式化程序,所以我们现在默认使用普通的单元格格式化程序。祝你好运。
  • 提交修复了错误,但是我没有看到页脚并且当我输入 $('tfoot');我得到&lt;tfoot&gt;&lt;tr&gt;&lt;td class="select-row-cell"&gt;&lt;/td&gt;&lt;td class="string-cell _id"&gt;&lt;/td&gt;&lt;td class="string-cell Order Class"&gt;&lt;/td&gt;&lt;td class="string-cell date"&gt;&lt;/td&gt;&lt;td class="string-cell Id"&gt;&lt;/td&gt;&lt;td class="number-cell total"&gt;$0.00&lt;/td&gt;&lt;/tr&gt;&lt;/tfoot&gt;
  • 听起来您在某处缺少收集事件侦听器。
猜你喜欢
  • 2015-03-11
  • 1970-01-01
  • 2016-05-14
  • 1970-01-01
  • 2018-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-20
相关资源
最近更新 更多