2012-06-12 24 views
12

Luchando para cargar json del archivo (myData.json) en la URL en un objeto para que pueda acceder a los valores de la propiedad.carga json del archivo en el objeto

- La carga de datos es inmediata, la necesito mucho en la aplicación.

- Voy a acceder a los datos en toda la aplicación, no solo como parte de una función que ocurre inmediatamente después de la carga de datos.

- Me he asegurado de que los datos de mi archivo estén formateados correctamente json.

Siguiendo el ejemplo de la API de jQuery, ¿no debería ser capaz de hacer algo tan simple como:

alerta (jqxhr.myProperty);

y obtener el valor? ¿Qué paso me estoy perdiendo aquí? He intentado ejecutar eval y una variedad de cosas como

var myObj = JSON.parse (jqxhr);

inútilmente.

Por favor ... gracias.

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

Respuesta

12

Creo que está haciendo que sea demasiado complicado :)

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

la función getJSON convierte automáticamente su respuesta en un objeto JSON adecuada. No es necesario analizar.

Mencionaste que estás utilizando esta información en todas partes, por lo que tendrás que esperar que la llamada ajax se complete antes de que los datos estén disponibles. Eso significa que envuelve toda la aplicación en la devolución de llamada getJSON. O el uso de un evento personalizado para determinar de este modo:

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

EDITAR

Después de una depuración en vivo rápida, la verdadera razón de no estar disponible la información fue la siguiente: javascript que consume JSON se encuentra en un archivo incluya el documento de la página NORTE del javascript en línea que realiza la llamada. Como resultado, JSON no era una variable global, y el alcance impedía su uso. Si realmente necesita una variable que ser global por lo que puede ser utilizado con línea JS, así como cualquier y todo su contenido js, ​​puede hacerlo de esta manera:

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

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

EDITAR 2

A partir de jQuery 3.0, las funciones de devolución de llamada son diferentes: Los métodos de devolución de llamada jqXHR.success(), jqXHR.error() y jqXHR.complete() se eliminan a partir de jQuery 3.0. Puede utilizar jqXHR.done(), jqXHR.fail(), y jqXHR.always() en lugar

de los comentarios @ mario-Lurig

+0

Eso no funcionará sin embargo. 'alert (JSON.property);' se ejecuta antes de llamar a la devolución de llamada. –

+0

ah usted está correcto – Fresheyeball

+0

y id como el manejo de errores y las características de éxito. ¿Por qué estoy usando el ejemplo? –

3

los datos JSON se pasa a la función de devolución de llamada de $ .getJSON. Así que esto funcionarí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 para la precaución. –

+0

Estoy cargando los datos en la llamada jquery que ocurre antes de document.onLoad(); incendios, así que estoy anticipando que estará disponible. el botón de inicio no se muestra hasta onLoad(); –

+1

@Fresheyeball, entonces, ¿qué hay de malo en indicar una posible trampa y sugerir una solución en la siguiente línea? – Andy

0

Creo que esto sería lo que está buscando, usted está intentando tener acceso a los datos devueltos por su llamada no el propio objeto de la persona que llama. En su ejemplo, jqxhr es el objeto que maneja la llamada JSON, no los datos. Así,

El primer ejemplo de this page es similar a lo que he explicado.