2013-09-23 4 views
2

У меня есть источник данных кендо, который загружается на document.ready() и заполняет выпадающий список с результатами запроса JSON. Затем, как только пользователь выбирает элемент в combobox, я скажу, что функция customerSelected() выполняется для загрузки значений для этого клиента. У меня проблема: я не могу установить другой источник данных Kendo для заполнения данных после загрузки страницы. Если я использую обычный JQuery ajax-вызов, данные, как представляется, загружаются после того, как шаблоны Kendo выполняются и не заполняют мои данные.Источник данных Kendo после загрузки страницы

function customerSelected(customerid) { 
    var customer = customerid; 

    var commTemplate = kendo.template(' # for (var i=0; i < data.length; i++) { # <div class="communication" contentEditable>#= data[i].fname # - #= data[i].lname # #= data[i].details #</div> # } # '); 
    var commData = new kendo.data.DataSource({ 
     transport: { 
      read: { 
       url: "index.php?mode=showCustomerData", 
       dataType: "json" 
      } 
     } 
    }); 

    $("#communications").html(commTemplate(commData)); 
} 

$('document').ready(function() { 

    var customers = new kendo.data.DataSource({ 
     transport: { 
      read: { 
       url: "index.php?mode=showCustomers", 
       dataType: "json" 
      } 
     } 
    }); 
    $("#customerBox").kendoComboBox({ 
     dataSource: customers, 
     dataTextField: "name", 
     dataValueField: "customer_id", 
     filter: "contains", 
     change: function(e) { 
      console.log(this.value()); 
      customerSelected(this.value()); 
      $("#customerSelected").val(this.value()); 

     } 
    }); 


}); 

Каждый источник данных здесь возвращает правильные данные JSON, которые я проверил с клиентом покоя. Проблема в том, что kendo.data.DataSource() в функции customerSelected() фактически ничего не делает. Я попробовал различные способы получить эту функциональность, к которой я привык, в чисто JQuery-мире, который делает Ajax-вызовы и добавляет/обновляет DOM. Что мне здесь не хватает, чтобы позволить другому источнику данных после загрузки DOM?

ответ

2

Ваши проблемы таковы:

  1. Вы не читаете данные после создания источника данных.

  2. Данные загружаются асинхронно, поэтому вы не можете использовать их сразу.

Попробуйте это:

function customerSelected(customerid) { 
    var customer = customerid; 

    var commTemplate = kendo.template(' # for (var i=0; i < data.length; i++) { # <div class="communication" contentEditable>#= data[i].fname # - #= data[i].lname # #= data[i].details #</div> # } # '); 
    var commData = new kendo.data.DataSource({ 
     transport: { 
      read: { 
       url: "index.php?mode=showCustomerData", 
       dataType: "json" 
      } 
     } 
    }); 

    // run this callback the next time data changes 
    // which will be when the data is done being read from the server 
    commData.one("change", function() { 
     $("#communications").html(commTemplate(commData.data())); 
    }); 

    // read the data from the server 
    commData.fetch(); 
} 
1

попробовать:

var commTemplate = kendo.template(' # for (var i=0; i < data.length; i++) { # <div class="communication" contentEditable>#= data[i].fname # - #= data[i].lname # #= data[i].details #</div> # } # '); 
var commData = new kendo.data.DataSource({ 
transport: { 
    read: { 
     url: "index.php?mode=showCustomerData", 
     dataType: "json" 
    } 
}, 
change: function() { 
    $("#communications").html(kendo.render(commTemplate, this.view()); 
} 
}); 

commData.read(); 

Взято из:. http://demos.kendoui.com/web/datasource/remote-data.html

+0

Это было полезно, но не заполняет данные. Я вижу, что DataSource на самом деле делает запрос на сервер сейчас, а вкладка chrome network developer показывает результаты: [{"id": "1", "fname": "Keizer", "lname": "Von", "details" : «ЭТО НЕКОТОРЫЕ ДЕТАЛИ»}], но данные не повторяются на странице. Я смог заставить механизм шаблонов выполнять итерацию данных, когда я пытался с jquery, но поля данных не назначались должным образом. – Keizer

+0

Возможно, мне нужно определить схему? console.log() reports {"options": {"data": [], "schema": {}, "serverSorting": false, "serverPaging": false, "serverFiltering": false, "serverGrouping": false, "serverAggregates": ложь, "партии": ложь, "транспорт": { "чтения": { "URL": "index.php? Mode = showCustomerData", "DATATYPE": "JSON"}}}, "_ карта" : {}, "_ предвыборка": {}, "_ данные": [], "_ pristineData": [], "_ диапазоны": [], "_ вид": [], "_ нетронутый": [], "_ разрушены": [], "_ группа": [], "_ событие": { "синхронизация": [пустая]}, "транспорт": { "опция": { "читать": { "URL": "index.php режим = showCustomerData "," dataType ":" json "}}," cache ": {}}," reader ": {}," _ requestInProgress ": true} – Keizer

+0

Дальше возиться Я смог получить данные для итерации, используя это в смене : function() {$ ("# communication"). html (commTemplate (this._pristine)); } – Keizer

0

$ ("# связи") HTML (commTemplate (this._pristine));

+2

Добавление объяснения о том, почему это решает этот вопрос, поможет учителю. –

+0

Это скорее взломать, чем придерживаться конвенций Кендо. Единственная причина, по которой он работает, заключается в том, что я выгрузил вывод DataSource изнутри и обнаружил, что this._pristine получил результирующие данные, которые я ожидал. Это должно было быть более прямым, чем это. Объект DataSource.data не был заполнен, но DataSource._pristine был, который при поиске в Google не мог найти ничего, связанного с _pristine – Keizer

+0

Взяв взгляд на исходный код, мне кажется, что проблема в том, что вы пытаетесь заполнить данные сразу после определения DataSource, но не гарантируется, что данные уже получены. Попробуйте добавить задержку в вашем сервисе (index.php) и посмотрите, продолжает ли он работать ...Я бы сказал, что если вы не запустите этот код внутри обратного вызова, ожидающего получения данных, он не сработает. Если вы не хотите зависеть от внутренних компонентов KendoUI и подвергаетесь будущим изменениям в реализации: вы не должны использовать метод '_pristine', а' data() '. – OnaBai

Смежные вопросы