Добрый день!
Есть данные, которые подгружаются асинхронно.
Вопрос, возможно ли их как-то привязать не прибегая к использованию callback onInit, OnLoad и пр.
http://webix.com/snippet/7a4f8890
Добрый день!
Это можно сделать через template
, так как он оперативно перерисовывается при изменении данных:
А если это label допустим. Он в данном случае функцию возвращает как строку
Но в принципе, можно использовать внешнюю функцию.
Вопрос немного даже другой, возможна какая-то отложенная загрузка как-бы.
Т.е у меня асинхронно загружаются модели, но в тоже время подгружаются компоненты webix. Как только мои данные загрузятся - webix посмотрит что у него прописано в template, label, value и пр. и обновит соответвующие данные.
Сейчас просто приходится использовать его эвенты или ждать загрузки моделей и лишь затем рендерить UI.
label - это не дата-компонент, поэтому придётся обновлять его через define
.
Отследить момент, когда будут загружены все модели, возможно через promise API:
webix.ui(/**/);
a = webix.ajax("someA.php");
b = webix.ajax("someB.php");
c = webix.ajax("someC.php");
webix.promise.all(a,b,c).then(function(a,b,c){
/* вот здесь будут доступны все данные */
});
а как template реагирует на изменение данных? если поменять info.title после инициализации, то никакой реакции не видно. (если data задать как info, само собой)
а как template реагирует на изменение данных?
Зависит от того, каким образом изменяются данные. При загрузке новых данных (load()/parse()
) компонент будет перерисован - это, собственно, и имелось в виду.
Если Вы меняете объект, из которого уже взяты данные, то ничего не произойдёт - компонент никак не связан с этим объектом после однократной загрузки.
Если изменяете данные в конфигурации ui.template, то нужен метод refresh()
, так как при прямом изменении объекта не вызывается никаких событий:
template.data.title = "newtitle";
template.refresh()
То же самое справедливо и для всех остальных data-компонент, которые работают с массивом данных (ui.datatable, ui.tree, etc.). Но если какую-то запись там нужно поменять программно, то вместо refresh()
для этого следует использовать метод updateItem()
:
datatable.getItem(id).value = "New value"
datatable.updateItem(id);