Обновление кендо dataSource через транспорт

Я пытаюсь установить URL-адрес удаленных данных на основе выбранного значения из другого раскрывающегося списка (cboSearchString1DDL.element[0].value). Я продолжаю изучать веб-элементы управления кендо, поэтому я не уверен, как наиболее эффективно выполнить эту задачу. Я попробовал пару способов, но все равно получаю сообщение об ошибке при чтении источника данных. Я пытаюсь установить его при закрытии DDL1. Вот где я нахожусь, я знаю, что это не правильный путь:

// search string 1 DDL
var cboSearchString1DDL = $("#cboSearchString1DDL").kendoDropDownList({
    autoBind: false,
    optionLabel: " "
}).data("kendoDropDownList");

// search string 2 DDL
var cboSearchString2DDL = $("#cboSearchString2DDL").kendoDropDownList({
    autoBind: false,
    optionLabel: " "    
}).data("kendoDropDownList");

// 1st DDL dataSource                   
var dataSourceTowns = new kendo.data.DataSource({                   
    transport: {       
       read: {
           url: _urlTowns,
           dataType: "json",
        }
    },
    schema: {
        data: "Towns"
    }
});

$("#cboSearchString1DDL").data("kendoDropDownList").wrapper.show();

// 1st DDL                               
var townsDDL = $("#cboSearchString1DDL").kendoDropDownList({
    autoBind: false,
    dataTextField: "Column1",
    dataValueField: "Column1",
    dataSource: dataSourceTowns,
    close: function () {
        alert(cboSearchString1DDL.element[0].value);
        streetsDDL.enable(true);
        streetsDDL.setDataSource(dataSourcestreetsDDL);
        streetsDDL.refresh();
    }
}).data("kendoDropDownList");

// show 2nd DDL 
$("#cboSearchString2DDL").data("kendoDropDownList").wrapper.show();
cboSearchString2DDL.enable(false);

// 2nd DDL datasource 
var dataSourcestreetsDDL = new kendo.data.DataSource({
    transport: {
        read: {
            url: _urlSOESearchAddress + "townName=" + cboSearchString1DDL.element[0].value + "&f=",
        dataType: "json",
        },
    },
    schema: {
        data: "StreetsinTown"
    }
});

// 2nd DDL
var streetsDDL = $("#cboSearchString2DDL").kendoDropDownList({
    autoBind: false,
    dataTextField: "Street",
    dataValueField: "Street",
    requestStart: function (e) {
        console.log("request started");
    },
    requestEnd: function (e) {
        var response = e.response;
        var type = e.type;
        console.log(type);
        console.log(response.length);
    }
}).data("kendoDropDownList");

Заранее спасибо!


person ripsin    schedule 18.11.2013    source источник
comment
cboSearchString1DDL.element[0].value, по-видимому, имеет значение null, когда происходит вызов удаленной службы. Спасибо.   -  person ripsin    schedule 19.11.2013
comment
Ну, это определенно не определено в коде, который вы разместили. Так что определите его или опубликуйте больше своего кода.   -  person carter    schedule 19.11.2013
comment
Извините за это, я обновил свой код с учетом краткости.   -  person ripsin    schedule 19.11.2013
comment
cboSearchString1DDL по-прежнему нигде не определен. Вы путаете селектор jquery с именами переменных?   -  person carter    schedule 19.11.2013
comment
Я предполагаю, что вы должны делать что-то вроде этого: $('#cboSearchString1DDL').val() вместо cboSearchString1DDL.element[0].value   -  person carter    schedule 19.11.2013
comment
Хорошо, теперь я вижу, что случилось с этим var. И вы пытаетесь получить значение раскрывающегося списка, чтобы указать правильный URL-адрес?   -  person carter    schedule 19.11.2013
comment
Спасибо, элементы управления определены ранее в проекте, я добавил их в свой код. Я получал успешное значение для cboSearchString1DDL.element[0].value и $('#cboSearchString1DDL').val() в методе закрытия в townsDDL. Однако он все еще ломается, когда вы нажимаете DDL2 (открыть). [чешу затылок...].   -  person ripsin    schedule 19.11.2013
comment
да (на ваш предыдущий комментарий), спасибо.   -  person ripsin    schedule 19.11.2013


Ответы (2)


Имейте в виду, что URL-адрес может быть функцией, которая возвращает URL-адрес в виде строки. Итак, если кодировать проще, вы также можете сделать что-то вроде:

var dataSourcestreetsDDL = new kendo.data.DataSource({
    transport: {
        read: {
            url: function () {
                var searchAddress = ...;
                var searchString = ...;
                return searchAddress + "townName=" + searchString + "&f=";
            }
        ...

Функция будет вызываться всякий раз, когда источнику данных потребуется прочитать данные. Это может быть проще, чем что-то менять, когда раскрывающийся список закрывается.

person CodingWithSpike    schedule 18.11.2013
comment
Потрясающе, спасибо. Виртуальное пиво для вас! Это сработало просто отлично. - person ripsin; 19.11.2013

$("#cboSearchString1DDL").kendoDropDownList({

вызывается дважды. Второй раз, когда он вызывается, он, вероятно, стирает набор переменных здесь:

var cboSearchString1DDL = $("#cboSearchString1DDL").kendoDropDownList({

Обычно с кендо, если вы собираетесь инициализировать компонент более одного раза в элементе, вам нужно выполнить .destroy(), чтобы сделать это чисто. Я даже не уверен, что это то, что вы пытаетесь сделать.

person carter    schedule 18.11.2013
comment
Я повторно использую элемент, вы правы. У меня есть большой оператор case, в котором я использую .hide() и .show() для замены AutoComplete или элемента управления DropDownList. Я посмотрю на .destroy() и когда его вызывать. Документация очень краткая. - person ripsin; 19.11.2013
comment
Еще одна вещь... У меня был динамический список, который я хотел использовать в раскрывающемся списке кендо в моей сетке кендо. Казалось, что выпадающее меню появилось только в тот момент, когда по нему щелкнули. Я использовал это в раскрывающемся списке фильтров. В итоге мне пришлось обнаруживать mousedown, создавать список и иметь обратный вызов в раскрывающемся списке кендо для результатов моего динамического списка. Может и не поможет. Трудно сказать, так как в кендо так много возможностей. - person carter; 19.11.2013
comment
Ой, я знаю. Я всегда узнаю что-то новое с этими элементами управления. Несколько разочаровывает, как и моя проблема выше, особенно когда я могу перехватить элемент управления, показывающий мне значение, но ломается. Я изучаю .destroy(). Звучит как забавный метод для использования на этом этапе;) - person ripsin; 19.11.2013