Заполнение JSTree данными JSON, полученными в AJAX
Я пытаюсь заполнить JSTree данными JSON, которые я получаю от службы (которая вызывается с использованием ajax). Однако в файле jquery.jstree.js я получаю сообщение "Ни данные, ни параметры установки ajax". Из-за этого JSTree просто отображает загрузочный файл.
Код AJAX (отредактирован, чтобы попытаться настроить json на локальный тест переменной, затем выполнить тест)
function getJSONData() {
var test;
$
.ajax({
async : true,
type : "GET",
url : "/JavaTestService/rs/TestService/MyFirstTestService?languageCode=en_US&version=2",
dataType : "json",
success : function(json) {
test = json;
},
error : function(xhr, ajaxOptions, thrownError) {
alert(xhr.status);
alert(thrownError);
test = "error";
}
});
return test;
}
Код JSTree
var jsonData = getJSONData();
createJSTrees(jsonData);
function createJSTrees(jsonData) {
$("#supplierResults").jstree({
"json_data" : {
"data" : jsonData
},
"plugins" : [ "themes", "json_data", "ui" ]
});
После некоторой отладки я обнаружил, что jsonData является undefined при передаче методу createJSTrees. Правильно ли я извлекаю эти данные в коде Ajax?
Спасибо заранее
Ответы
Ответ 1
Я раньше не тестировал ваш подход, когда вы предоставляете параметр данных непосредственно в плагин json_data, поэтому я не смогу предоставить ответ на этот сценарий.
Однако, поскольку вы используете вызов AJAX для получения данных, не можете ли вы отправить вызов AJAX в JSTree и позволить ему обрабатывать вызов самостоятельно? Вот как я настроил вызов AJAX в своем коде:
(...)
'json_data': {
'ajax': {
'url': myURL,
'type': 'GET',
'data': function(node) {
return {
'nodeId': node.attr ? node.attr("id") : ''
};
}
},
'progressive_render': true,
'progressive_unload': false
},
(...)
Ответ 2
jsonData - это undefined, потому что getJSONData() не возвращает значение. Вы не можете полагаться на возвращаемое значение из обработчика успеха $.ajax, если вы не назначили переменную local getJSONData(), которая возвращается после завершения вызова $.ajax. Но вам нужно что-то подобное, что также полезно для асинхронности:
<script type="text/javascript">
$(function() {
$.ajax({
async : true,
type : "GET",
url : "/JavaTestService/rs/TestService/MyFirstTestService?languageCode=en_US&version=2",
dataType : "json",
success : function(json) {
createJSTrees(json);
},
error : function(xhr, ajaxOptions, thrownError) {
alert(xhr.status);
alert(thrownError);
}
});
});
function createJSTrees(jsonData) {
$("#supplierResults").jstree({
"json_data" : {
"data" : jsonData
},
"plugins" : [ "themes", "json_data", "ui" ]
});
}
</script>