Kendo 网格:为组合框模板或编辑器设置焦点和 select 所有文本

Kendo Grid: Set focus and select all text for a Combobox template or editor

我一直在尝试使用组合框作为列的编辑器或模板,区别在于一个(模板)始终存在,而另一个(编辑器)仅在使用编辑时显示列中的单元格。 我已经尝试了好几个小时了,但我不确定接下来要尝试什么。

我想做的是,当用户切换到包含其中任何一个的单元格时,组合框变为活动状态(这适用于编辑器但不适用于模板),当前文本是 selected(所以如果用户开始输入,当前值将被清除并输入新文本)。

完整样本为here

所以,我这里有 2 个问题。 1. 如何将焦点设置到用作模板的组合框。我在两个地方尝试过,第一个是在模板中 - 我知道这里的语法是错误的,但不知道该怎么做...

function createComboTemplate(data, field) {
  var tmpl = '<input style="width:100%" ' +
   'kendo-combo-box ' +
   'text-field="\'display\'" ' +
   'suggest = true ' +
   'filter="\'contains\'" ' +
   'value-field="\'rego\'" ' +
   'source="dataItem.carSource"' +
   'data-value="dataItem.car.rego" ' +
   'k-on="dataItem.onFocus(e)" ' +  // how to do this?
   'k-on-change="dataItem.handleDDLChange(kendoEvent, dataItem, \'' + field + '\', this)"/>';

 return tmpl;
 }

所以上面我有行 'k-on="dataItem.onFocus(e)" ' 当然什么都不做。我正在尝试做一个

"var combo = input.data("kendoComboBox");
  combo.input.on("focus", function () {"...

类似于我在编辑器中第二个问题中所做的(见下文)

接下来我尝试做的是将焦点设置在以下块中..

beforeEdit: function (e) {
        if (e.field === "car.display") {
            e.preventDefault();
            var grid = $("#gridID").data("kendoGrid");
            var current = grid.current();
            var input = current.find("k-input")
            var combo = input.data("kendoComboBox");
            console.log("combo is " + combo);
            // combo is null
            if (combo != null) {
                combo.focus();
            }

我似乎无法在此处获取组合实例(它始终为空) 我在这里做错了什么?

2.The 第二个问题是编辑器..

    function createCombo(container, options, data) {

     var input = $('<input/>')
     input.appendTo(container)
     input.kendoComboBox({
     autoBind: true,
      ...

     var combo = input.data("kendoComboBox");
     combo.input.on("focus", function () {
      var element = this;
     setTimeout(function () {
      // select all text?
      combo.select();
  });
 });
 }

在上面调用了焦点处理程序,但是 combo.select(); 没有 select 文本

所以上面有几件事,但我试图在这两种情况下做同样的事情,在 Tab 上组合 selected,并且还有所有文本 selected.

如有任何帮助,我们将不胜感激! 提前致谢

感觉不太好 angular,但还行:

$("#gridID").on("focus", ".k-input", function() {
    var parent = $(this).closest(".k-combobox");
    if (parent.length >0) {
        var input = $(parent).find("input:not(:visible)");
        var combo = $(input).getKendoComboBox();
        if (combo) {
            combo.input.select();
        }
    }
})

beforeEdit: function (e) {
    if (e.field === "car.display") {
        e.preventDefault();
        var current = this.current();
        $(current).find(".k-input").first().focus();
    }
},

(demo)

您也可以在 beforeEdit 中执行此操作(但仅限于汽车列,因为在其他情况下编辑器还不存在):

beforeEdit: function (e) {
    if (e.field === "car.display") {
        e.preventDefault();
        var current = this.current();
        var input = current.find("input:not(:visible)")
        var combo = input.data("kendoComboBox");
        if (combo) {
            combo.input.select();
        }
    }
},

(demo)

这对我有用。这是一种更简单、更优雅的方法,适用于页面上的任何组合框,无论何时呈现(kendo 自动添加 role="combobox" 属性) :

$(document).on('focus', 'input[role="combobox"]', function () {
    $(this).select();
});