Динамическое наполнение DataTable из JS

Здравствуйте

Имею следующую таблицу (привожу ее кусочек, так как она большая)

id: “tableOrders”,
view: “datatable”,
select: “row”,
columns: [
{ id: “order”, header: [{ text: “Заказ”, colspan: 2 }, { text: “Номер” }], editor: “select”, options: url + “/dev/sewing/AdminGetOrderBarcodesJson” },
{ id: “orderCustomer”, header: ["", “Заказчик”], editor: “text”, width: 150 }
]

Первый столбец таблицы имеет название “Номер” и его Editor подгружает данные из функции на сервере AdminGetOrderBarcodesJson

Имеется JS-функция, которая должна наполнять эту таблицу данными. Ниже ее фрагмент

$$(‘tableOrders’).add({
order: order.Barcode.Code,
});

где order.Barcode.Code - это корректное значение, которое совпадает с одним из значений, возвращаемые из сервера функцией AdminGetOrderBarcodesJson

Сервер возвращает JSON следующего формата

[
{
id: “число”,
value: “строка”
},
{
id: “число”,
value: “строка”
},…
]

order.Barcode.Code содержит одно из значение value, которое возвращается в массиве из сервера

То есть, я ожидаю, чтобы при вызове метода AdminGetOrderBarcodesJson моя JS-функция заполнила таблицу. Она ее и заполняет, но есть проблема с элементами таблицы, которые содержат внутри себя Editor типа Select.

Если вопрос поставить более глобально, то как сделать, чтобы таблица могла быть заполнена при помощи JS-функции add и одновременно в ней была ячейка, которая содержит Editor типа Select, которая получает свои данные из сервера?

Буду благодарен за ответ.
Владимир

а в чем заключается проблема?

проблема в том, что ячейка остается пустой (не заполненной). все остальные ячейки таблицы заполняются, а в которой есть editor типа Select, не заполняется. если по ней кликнуть, то появляется editor с заполненным списком, как и ожидается

пример можно посмотреть здесь
http://178.172.236.55:12345/sites/admin.html

первая закладка “история заказов”
если кликнуть “новый заказ”, то появится пустая строка в таблице. если кликнуть “номер”, то появится заполненный editor

если кликнуть “обновить таблицу”, то таблица наполнится одной строкой. при этом все ячейки заполняются, но ячейка “номер” пустая. если по ней кликнуть, то появляется заполненный список.

а мне надо, чтобы она была одновременно и заполненная и в ней была заполненный список

у вас классическая проблема с ID=0 http://forum.webix.com/discussion/7936/baga-richselect-select-combo-value-0

{“id”:0,“value”:“Новый”} id поменяйте на -1, проблема решится

Здравствуйте!

По умолчанию, ID опций select-эдитора должны совпадать со значением соответствующего атрибута данных. Если в данных задано несуществующее в опциях значение, оно не будет отображено. Это можно изменить, настроив template:

{
   id:"columnId"
   editor:"select", options:"/url",
   template:"#attributeKey#"
}

Также, воздержитесь от использования 0 как ID - это необходимое ограничение в Webix.

Благодарю вас, теперь работает.
Скажите, а возможно ли наполнение options не из веб-метода, а из js-функции? Это не очень удобно, что надо готовить отдельный метод для подготовки данных для select. Гораздо удобнее, чтобы те же данные возвращались из JS-Функции

можете просто задать {options:[{id:1, value:“AAA”}, {id:2, value:“BBB”}]}

Да, это я в документации видел. Но у меня данные подгружаются динамически. Единственный вариант, который я увидел - это так

options: “url”

Мне показалось, что было бы логично сделать то же самое, но вместо урла указывать имя js-функции. Но это не работает, насколько я понял. Вот и появился вопрос, это на самом деле так или можно все таки данный из функции подгружать?

Дело в том, что тогда придется писать большое количество веб-методов, которые будут возвращать простые пакеты для options. Что не очень хорошо для сервера. Гораздо проще сделать большой веб-метод, который вернет за один раз большую пачку данных. А вот уже JS может эти данные подготовить для options.

можно после загрузки таблицы, в отдельном серверном вызове поменять значения options в необходимых колонках. http://webix.com/snippet/870e89cb
http://docs.webix.com/api__ui.datatable_refreshcolumns.html

Отлично, спасибо