ajax звонки со страницы php - проверка на наличие пустого массива в результате
У меня есть страница PHP, которая включает в себя следующий JavaScript:
<script>
$(document).ready(function(){
$('#search').hide();
});
$('#L1Locations').live('change',function(){
var htmlstring;
$selectedvalue = $('#L1Locations').val();
$.ajax({
url:"<?php echo site_url('switches/getbuildings/');?>" + "/" + $selectedvalue,
type:'GET',
dataType:'json',
success: function(returnDataFromController) {
alert('success');
var htmlstring;
htmlstring="<select name='L2Locations' id='L2Locations'>";
htmlstring = htmlstring + "<option value='all'>All</option>";
console.log(returnDataFromController);
var JSONdata=[returnDataFromController];
alert('string length is' + JSONdata.length);
if(JSONdata.length > 0)
{
for(var i=0;i<JSONdata.length;i++){
var obj = JSONdata[i];
for(var key in obj){
var locationkey = key;
var locationname = obj[key];
htmlstring = htmlstring + "<option value='" + locationkey + "'>" + locationname + "</option>";
}
}
$('#l2locations').html(htmlstring);
}
else
{
alert('i think undefined');
$('#l2locations').html('');
}
}
});
$('#search').show();
});
</script>
то, что я пытаюсь сделать, это динамически показать поле со списком, если переменная "returnDataFromController" имеет какие-либо элементы.
Но я думаю, что у меня есть ошибка со строкой, которая проверяет JSONdata.length.
Независимо от того, возвращает ли вызов ajax заполненный массив или пустой, длина всегда показывает существо 1. Я думаю, что я запутался в том, что считается, когда вы запрашиваете длину. Или, может быть, мое свойство dataType неверно? Я не уверен.
В случае, если вам это помогает, строка "console.log(returnDataFromController)" дает следующие результаты, когда я получаю данные обратно из вызова ajax (и, следовательно, когда нужно создать комбо)
[16:28:09.904] ({'2.5':"Admin1", '2.10':"Admin2"}) @ http://myserver/myapp/index.php/mycontroller/getbranches:98
В этом случае поле со списком отображается с правильным содержанием.
Но в сценарии, где я возвращаю пустой массив, также создается поле со списком. Вот что выдает вызов console.log:
[16:26:23.422] [] @ http://myserver/myapp/index.php/mycontroller/getbranches:98
Можете ли вы сказать мне, где я иду не так?
РЕДАКТИРОВАТЬ:
Я понимаю, что я воспринимаю свои возвращаемые данные как объект - я думаю, что это то, что я хочу, потому что я возвращаю массив. Я думаю, мне нужно знать, как правильно проверить длину массива в JavaScript. Я думал, что это просто длина.
Благодарю.
РЕДАКТИРОВАТЬ 2: Может быть, я должен просто послушать результаты, которые посылает мой контроллер? Вместо того, чтобы возвращать пустой массив, я должен вернуть false или NULL?
if (isset($buildingforbranch))
{
echo json_encode($buildingforbranch);
}
else
{
echo json_encode(false);
}
РЕДАКТИРОВАТЬ 3:
На основании сообщения, найденного в Parse JSON в JavaScript? Я изменил код в разделе "success" вызова ajax так:
success: function(returnDataFromController) {
var htmlstring;
htmlstring="<select name='L2Locations' id='L2Locations'>";
htmlstring = htmlstring + "<option value='all'>All</option>";
console.log(returnDataFromController);
var JSONdata=returnDataFromController,
obj = JSON && JSON.parse(JSONdata) || $.parseJSON(JSONdata);
alert(obj);
}
Но я получаю сообщение об ошибке на
[18:34:52.826] SyntaxError: JSON.parse: unexpected character @ http://myserver/myapp/index.php/controller/getbranches:102
Строка 102:
obj = JSON && JSON.parse(JSONdata) || $.parseJSON(JSONdata);
1 ответ
Проблема была в том, что данные с контроллера искажены JSON.
Обратите внимание на часть моего поста, где я показываю возвращаемые данные:
({'2.5':"Admin1", '2.10':"Admin2"})
2.5 должен быть в двойных кавычках, а не в одинарных. Я не понимаю, как / почему это происходит, но я создам еще один пост, чтобы разобраться с этим вопросом. Спасибо всем.