2012-06-12 13 views
12

Próbuję załadować json z pliku (myData.json) na adres URL do obiektu, aby uzyskać dostęp do wartości właściwości.Załaduj json z pliku do obiektu

- Dane ładują się natychmiast, potrzebuję ich dużo w aplikacji.

- Mam zamiar uzyskać dostęp do danych w całej aplikacji, a nie tylko jako część jednej funkcji, która ma miejsce natychmiast po załadowaniu danych.

- Zapewniłem, że dane w moim pliku są poprawnie sformatowane json.

Wzorem na API jquery, nie byłbym w stanie zrobić coś prostego, takich jak:

alert (jqxhr.myProperty);

i uzyskać wartość? Jakiego kroku tu brakuje? Próbowałem uruchomić eval i różne rzeczy, takie jak

var myObj = JSON.parse (jqxhr);

bezskutecznie.

Proszę ... dziękuję.

// 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"); }); 

Odpowiedz

12

myślę, że robią to zbyt skomplikowane :)

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"); }); 

funkcja getJSON automatycznie przekształca swoją odpowiedź do właściwego obiektu JSON. Nie trzeba parsować.

Wspomniałeś, że używasz tych danych w każdym miejscu, więc będziesz musiał czekać na zakończenie wywołania ajax, zanim dane będą dostępne. Oznacza to owijanie całej aplikacji w wywołanie zwrotne getJSON. Lub przy użyciu niestandardowego zdarzenia, aby określić tak:

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

Po szybkim debugowania na żywo, prawdziwym powodem dane są niedostępne, było to: javascript, który zużywa JSON znajdował się w pliku dołącz dokument strony NORTH inline javascript wykonujący połączenie. W rezultacie JSON nie był zmienną globalną, a zakres uniemożliwiał jej użycie. Jeśli naprawdę potrzebujemy zmiennej być globalny, więc może być używany z inline JS, a także wszelkie zawarte pliki js, można to zrobić tak:

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

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

EDIT 2

Od wersji jQuery 3.0 funkcje wywołania zwrotnego są różne: Metody wywołania zwrotnegojqXHR.success(), jqXHR.error() i jqXHR.complete() są usuwane z wersji jQuery 3.0. Można użyć jqXHR.done(),(), jqXHR.fail i jqXHR.always() zamiast

od komentarzach @ mario-lurig

+0

To jednak nie zadziała. 'alert (JSON.property);' jest wykonywany przed wywołaniem wywołania zwrotnego. –

+0

ah masz rację – Fresheyeball

+0

i identyfikator podobny do funkcji obsługi błędów i sukcesu. dlaczego używam tego przykładu. –

3

dane JSON jest przekazywane do funkcji zwrotnej od $ .getJSON. Więc to będzie działać:

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 za ostrzeżenie. –

+0

im ładowanie danych w wywołaniu jquery, które ma miejsce przed document.onLoad(); pożary, więc przewiduję, że będą dostępne. przycisk start nie wyświetla się aż do onLoad(); –

+1

@Fresheyeball, co jest nie tak z wskazaniem możliwej pułapki i sugerowaniem rozwiązania jednej linii poniżej? – Andy

0

myślę, że to byłoby to, czego szukasz, próbujesz uzyskać dostęp do danych zwróconych z zaproszenia nie sam obiekt rozmówca. W twoim przykładzie, jqxhr jest obiektem, który obsługuje wywołanie JSON, a nie dane. Więc,

Pierwszy przykład na this page jest podobny do tego, co wyjaśniłem.