2012-06-12 5 views
12

Борьба с загрузкой json из файла (myData.json) по URL-адресу в объект, чтобы я мог получить доступ к значениям свойств.загрузить json из файла в объект

- Данные загружаются немедленно, мне это очень нужно в приложении.

- Я собираюсь получить доступ к данным во всем приложении, а не только как часть одной функции, которая происходит сразу после загрузки данных.

- Я гарантировал, что данные в моем файле правильно отформатированы json.

Следуя примеру на Jquery API, я не должен быть в состоянии сделать что-то простое, как:

предупреждение (jqxhr.myProperty);

и получить значение? Какой шаг мне здесь не хватает? Я пробовал использовать eval и множество вещей, таких как

var myObj = JSON.parse (jqxhr);

не напрасно.

Просьба .... спасибо.

// Assign handlers immediately after making the request, 
// and remember the jqxhr object for this request 
var jqxhr = $.getJSON("example.json", function() { 
    alert("success"); 
}) 
.success(function() { alert("second success"); }) 
.error(function() { alert("error"); }) 
.complete(function() { alert("complete"); }); 

// perform other work here ... 

// Set another completion function for the request above 
jqxhr.complete(function(){ alert("second complete"); }); 

ответ

12

Я думаю, что вы делаете это слишком сложно :)

var JSON; 

$.getJSON('example.json', function(response){ 
     JSON = response; 
     alert(JSON.property); 
}) 
//feel free to use chained handlers, or even make custom events out of them! 
.success(function() { alert("second success"); }) 
.error(function() { alert("error"); }) 
.complete(function() { alert("complete"); }); 

функция getJSON автоматически преобразует ваш ответ в надлежащий объект JSON. Не нужно разбираться.

Вы упомянули, что используете эти данные повсюду, поэтому вам нужно будет дождаться завершения вызова ajax до того, как данные будут доступны. Это означает либо обертывание всего вашего приложения в обратном вызове getJSON. Или с помощью пользовательского события, чтобы определить, например, так:

var JSON; 

$(window).on('JSONready', function(){ 
     alert(JSON.property); 
}); 

$.getJSON('example.json', function(response){ 
     JSON = response; 
     $(window).trigger('JSONready'); 
}); 

$('#elem').on('click', function(){ 
     //event likely to take place after ajax call has transpired 
     //it would still be better to assign this listener in a callback, 
     //but you can get away with not doing it, if you put in a catch 
     if(JSON){ 
      alert(JSON.property); 
     }   
}); 

EDIT

После быстрой живой отладки, реальная причина для данных недоступности было это: JavaScript, который потребляет JSON находился в файле включить документ страницы NORTH встроенного javascript, выполняющего вызов. В результате JSON не была глобальной переменной, и область действия не позволяла ее использовать. Если вы действительно нужна переменная должна быть глобальной, поэтому он может быть использован с встроенным JS, а также любые и все включено JS файлы, вы можете сделать это так:

(function(){ 
     var limitedScopeVariable = 25; 
     window.globalScopeVariable = 30; 
    })(); 

    $(function(){ 
     alert(globalScopeVariable); //works! 
     alert(limitedScopeVariable); //fails! 
    }); 

EDIT 2

С jQuery 3.0 функции обратного вызова различаются: методы обратного вызова jqXHR.success(), jqXHR.success(), jqXHR.error() и jqXHR.complete() удалены с jQuery 3.0 . Вы можете использовать jqXHR.done(), jqXHR.fail(), и jqXHR.always() вместо

из комментариев @ марио-lurig

+0

Это не сработает. 'alert (JSON.property);' выполняется до вызова callback. –

+0

ах вы правы – Fresheyeball

+0

и id как функции обработки ошибок и успеха. почему im использует пример. –

3

данные JSON передается функции обратного вызова $ .getJSON. Так что это будет работать:

var jqxhr; 

$.getJSON("example.json", function(data) { 
    jqxhr = data; 
}); 

// alert(jqxhr.property); 
// caution: this won't work immediately on load, since the ajax call runs asynchronously and hasn't finished at that time 

// it should be available at a later time, like a click event 
$('a#something').click(function(){ 
    if(jqxhr){ 
      alert(jqxhr.property); 
    }else{ 
      alert('getJSON not yet complete or failed'); 
    } 
}); 
+1

+1 для осторожности. –

+0

im загружает данные в вызов jquery, который происходит до document.onLoad(); пожаров, поэтому я ожидаю, что он будет доступен. кнопка запуска не отображается до onLoad(); –

+1

@Fresheyeball, так что не так с указанием возможной ловушки и предлагая решение на одну строку ниже? – Andy

0

Я думаю, что это будет то, что вы ищете, вы пытаетесь получить доступ к данным возвращения из вызова не объект абонента сам. В вашем примере jqxhr - это объект, который обрабатывает вызов JSON, а не данные. Так,

Самый первый пример на this page похож на то, что я объяснил.

Смежные вопросы