Эта статья о динамической загрузке Tree, TreeTable и TreeCollection. Если вам нужна дополнительная информация, обратитесь к статье Динамическая загрузка данных
Динамическая загрузка данных в компоненты с иерархической структурой происходит следующим образом:
1. Сначала загружаются верхние родительские узлы, которые изначально свернуты (если не задано значение true свойству open).
2. Затем данные загружаются для каждого узла, когда он раскрывается.
var tree = webix.ui({
view: "tree",
url: "data/data_dyn.php"
});
// or
var tree = webix.ui({/* tree config */});
tree.load("data/data_dyn.php");
По умолчанию Webix ожидает данные в формате JSON. Сервер также может возвращать данные в формате XML (см. Загрузка данных в Tree).
Динамическую загрузку можно настроить тремя способами:
onDataRequest
Related sample: Tree: Dynamic Loading
Для тех элементов данных, у которых могут быть дочерние элементы, вы можете установить значение true для флага webix_kids. С этим флагом ветка станет папкой.
webix.ui({
view: "tree",
url: "data/data_dyn.php",
data: [
// ниже - родительский узел
{ id: "1", value: "Branch", webix_kids: true }
]
});
После того, как пользователь откроет папку, клиент отправит запрос на сервер для получения дополнительных данных, напр.:
data/data_dyn.php?continue=true&parent=1
URL в запросе основан на свойстве url компонента. Давайте подробнее остановимся на URL и его параметрах:
Если url задан, Webix отправит первоначальный запрос без параметров. Убедитесь, что скрипт для серверной стороны обработает обе ситуации:
После отправки запроса клиент будет ждать ответ (в формате JSON), который содержит дочерние элементы, напр.:
{
parent:"1", data:[
{ id:"11", value:"Some child item 1" },
{ id:"12", value:"Some child item 2" }
]
}
В самих дочерних элементах также может быть свойство webix_kids.
Вы можете написать свои скрипты для динамической загрузки веток дерева.
loadBranch()
Чтобы подгружать ветки с помощью метода loadBranch, вы можете добавить обработчик для события onBeforeOpen или onAfterOpen и вызвать метод. Предположим, что мы загрузили первоначальные данные:
webix.ui({
view: "tree",
data: [
{ id:1, value: "Layout Branch", webix_kids: true },
{ id:2, value: "Data Branch", webix_kids: true },
],
on: {
onBeforeOpen: function (id) {
// если дочерние элементы еще не загружены
if (this.getItem(id).$count === -1)
this.loadBranch(id, null, "data/data_dyn.php"); // null означает отсутствие коллбэк-функции
}
}
});
Related sample: Loading branch Data
URL нового запроса будет основан на свойстве url, которое можно переопределить с помощью метода loadBranch - "data/data__dyn.php?continue=true&parent=1". Параметры URL те же, что и описанные выше:
Если вы не меняете URL, то последний параметр у метода loadBranch()
можно опустить:
var tree = webix.ui({
view: "tree",
url: "data/data_dyn.php",
...
});
this.loadBranch(id, null); // "data/data_dyn.php" will be used
Убедитесь в том, что данные для ветки, которые отправил сервер - это объект со свойствами parent и data. Ответ в формате JSON должен выглядеть так:
{ parent: 1, data: [ /*...массив дочерних элементов...*/ ] }
Задайте обработчик события onDataRequest, чтобы изменить работу динамической загрузки по умолчанию:
onDataRequest срабатывает, когда пользователь открывает узел, у которого есть свойство webix_kids:
{ id: "1", value: "Layout Branch", webix_kids: true }
Открытие узла запускает динамическую загрузку. Другими словами, если у компонента есть источник данных (заданный либо свойством url, либо методом load), то запрос посылается с использованием этого URL.
Тем не менее, событие onDataRequest дает возможность переопределить это поведение.
Предположим, что мы сначала загрузили данные одним из способов:
webix.ui({
view: "tree",
data: [
{ id: 1, value: "Layout Branch", webix_kids: true },
{ id: 2, value: "Data Branch", webix_kids: true },
],
on: {
onDataRequest: function (id) {
webix.message("Getting children of " + id);
this.parse(
webix.ajax().get("data/data_dyn_json.php?parent="+id)
.then(function(data){
return data = data.json();
});
);
// отмена поведения по умолчанию
return false;
}
}
});
Related sample: Dynamic Loading: Modifying onDataRequest Event
В этом примере полностью изменена логика динамической загрузки по умолчанию.
Убедитесь в том, что данные для ветки, которые вы получаете, содержат свойства parent и data. Ответ в формате JSON должен выглядеть следующим образом:
{ parent:1, data:[/* массив дочерних элементов */]}