Получить ссылку на Kendo Grid изнутри обработчика ошибок

Уже есть вопросы как получить настраиваемую обработку ошибок с ответами, но все эти ответы используют "внешнюю" ссылку/селектор для сетки, чтобы заставить ее работать, например:

function onError(e) {
    if (e.errors) {
        var message = "Error:\n";  

        var grid = $('#gridID').data('kendoGrid'); // <<- here
    (...)
}

Можно ли получить ссылку на сетку внутри функции обработки ошибок, не предоставляя селектор вручную или "извне" (поскольку глобальные переменные являются meh)? Таким образом, обработка ошибок script может быть полностью автономной.

Ответ 1

Версия 'current' от 2015-12-05

По-видимому, теперь исходную сетку можно получить через e.sender.table.context.id. Спасибо, Akbari!

KendoUI 2014.1.318

Решение ниже не будет работать. Кажется, что в источнике данных отсутствует член table.

Мое обходное решение было довольно грубым, просто используя селекторы, чтобы захватить все элементы k-grid, которые возвращают не-null для .data("kendoGrid") и сравнивают источники данных с arg.sender. Когда источники данных совпадают - у нас есть сетка, которая вызвала ошибку:

$(".k-grid").each(function() {
    var grid = $(this).data("kendoGrid");
    if (grid !== null && grid.dataSource == args.sender) {
        // We have a winner!
    }
});

Оригинальный ответ

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

Внутри функции this не привязана к сетке, а к DataSource, которую использует сетка внутри, поэтому ее нельзя использовать непосредственно для изменения поведения обработки ошибок. Требуется немного плохо документированной магии.

Это означает, что (с версии Kendo UI MVC версии 2013.3.1119.545) можно использовать следующее:

e.sender.options.table.context

для возврата оберточной сетки (элемент DOM), а

e.sender.options.table.context.id

возвращает идентификатор сетки.

Это означает, что с помощью jQuery сетку можно получить с помощью:

var grid = $(e.sender.options.table.context).data("kendoGrid");

И остальная часть обработки ошибок script остается точно такой же.

Технически, как this, связанные в области видимости, так и sender, похоже, одно и то же: grid DataSource, поэтому они должны быть взаимозаменяемыми в приведенном выше примере.

Ответ 2

Я бы предложил передать идентификатор целевой сетки в качестве аргумента вашей функции. Пример:      .Events(events = > events.Error( "function (args) {telerikGridAraxErrorhandler (args, 'myGridId');}" ))

Я думаю, что это приведет к меньшей поддержке, если они изменят что-либо в будущих версиях Telerik Grid

Ответ 3

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

Другим возможным решением является использование ограничения, связанного с именем виджета:

function errorHandler(gridName) {
   return function(e) {
       // handle the event.
       var grid = $(gridName).data("kendoGrid");
   };
}

$("#grid").kendoGrid({
   dataSource: {
       error: errorHandler("#grid")
   }
});

Ответ 4

Я знаю, что это старо, но кажется устаревшим. Мне нужно было получить доступ к имени сетки внутри ошибки, потому что ошибка исходила из "внутренней сетки" (из шаблона внутри и внутри основного шаблона детализации сетки). Это из форумов Telerik, поэтому я не хочу брать кредит, но мне понадобилось немного времени, чтобы найти его, поэтому я делюсь здесь. Для бритвенных помощников,

@Html.Kendo().Grid<Model>()
   .DataSource(dataSource => dataSource
    .Events(events => events.Error("function(e){error_handler(e, 'GridName')"}))

Для Jquery:

$("#Promotions").kendoGrid({
    dataSource: {
        error: errorHandler("#Promotions")
    }
});

и функция Javascript

Function error_handler(e, GridName)
{
}