2

我们正在使用 Backgrid 并发现要开始在 Backgrid 中编辑“布尔”(复选框)单元格,您必须单击两次:第一次单击被忽略并且不会切换复选框的状态。理想情况下,我们会找到导致这种行为的根源(例如,调用 preventDefault )并在那里解决它,但我起初尝试了一种不同的方法,使用 BooleanCell 的 enterEditMode 方法的以下扩展,这似乎是一个合乎逻辑的地方,因为它在进入编辑模式时,复选框单击被忽略。

问题是我的尝试还切换了先前编辑的复选框的状态。这是代码。

var BooleanCell = Backgrid.BooleanCell.extend({
    /*
    * see https://github.com/wyuenho/backgrid/issues/557
    */
    enterEditMode: function () {
        Backgrid.BooleanCell.prototype.enterEditMode.apply(this, arguments);
        var checkbox = this.$('input');
        checkbox.prop('checked', !checkbox.prop('checked'));
    }
});
4

2 回答 2

1

以下似乎有效:

var BooleanCell = Backgrid.BooleanCell.extend({
    editor: Backgrid.BooleanCellEditor.extend({
        render: function () {
            var model = this.model;
            var columnName = this.column.get("name");
            var val = this.formatter.fromRaw(model.get(columnName), model);

            /*
             * Toggle checked property since a click is what triggered enterEditMode
            */
            this.$el.prop("checked", !val);
            model.set(columnName, !val);

            return this;
        }
    })
});

这是因为在单击时,Backgrid.BooleanCell 的 enterEditMode 方法会调用 render 方法,并且该方法会破坏并重新创建复选框,如下所示,但这样做会丢失原始“非编辑”的选中状态(单击后)模式”复选框

  this.$el.empty();
  this.$el.append(this.currentEditor.$el);
  this.currentEditor.render();
于 2015-02-09T21:49:05.330 回答
1

更简单的方法:

var OneClickBooleanCell = Backgrid.BooleanCell.extend({
  events: {
    'change input': function(e) {
      this.model.set(this.column.get('name'), e.target.checked);
    },
  },
});

这完全绕过了 CellEditor 机制,只是通过更新模型对复选框上的输入事件做出反应。

于 2016-09-23T15:16:26.947 回答