Negozio ajax dati in una variabile globale

Di continuare con JQuery – Memorizzazione ajax risposta nella variabile globale

Soluzione accettata in qualche modo non funziona per me.

$(document).ready(function() {
    var dataStore = (function(){
        var xml;

        $.ajax({
          type: "GET",
          url: "/?do=getcontentadm1n&category=homepage",
          dataType: "json",
          success : function(data) {
                        xml = data.html;
                alert(xml); //WORKS
                    }
        });

        return {getXml : function()
        {
            if (xml) return xml;
        }};
    })();

    var somevar = dataStore.getXml();

    alert(somevar); //UNDEFINED
});

C’è altra soluzione?

Grazie.

OriginaleL’autore Alex G | 2012-02-07

5 Replies
  1. 11

    È vuoto, perché per il momento getXml è detto, la richiesta ajax non ha completato, ricordate ajax è asincrona. Un modo per ottenere intorno ad esso è per forza di essere sincrono:

           $.ajax({
              async: false,
              type: "GET",
              url: "/?do=getcontentadm1n&category=homepage",
              dataType: "json",
              success : function(data) {
                            xml = data.html;
                    alert(xml); //WORKS
                        }
            });

    Di rispondere al commento di:

    Voglio eseguire AJAX onclick, poi negozio data.html per gli altri eventi del mouse

    var dataStore = (function(){
        var html;
        function load(){
               $.ajax({
                  async: false,
                  type: "GET",
                  url: "/?do=getcontentadm1n&category=homepage",
                  dataType: "json",
                  success : function(data) { html = data.html; }
                });
        }
        return {
            load : function() { 
                if(html) return;
                load();
            },
            getHtml: function(){
                 if(!html) load();
                 return html;
            }
        }
    })();
    
    $(element1).click(function(){
        dataStore.load();
    });
    
    $(element2).click(function(){
        var html = dataStore.getHtml();
        //use html
    });
    Abbastanza sicuro. Come evitare di funzione in una variabile?
    non capisco la tua domanda, puoi essere più specifico?
    Senza questo “var dataStore = (function(){“. Voglio eseguire AJAX onclick, poi negozio data.html per gli altri eventi del mouse.
    che tipo di fuori dello scopo della tua domanda, avrei una risposta qui, ma sarebbe la mia risposta irrilevante per la questione. Fondamentalmente si può fare $(element).click(loadDataUsingAjax); in cui tale funzione viene caricare i dati con il codice che ho postato e quindi memorizzare in una variabile.
    $(element1).fare clic su(loadDataUsingAjax storeinvar); $(element2).fare clic su(getstoredvar);

    OriginaleL’autore ggreiner

  2. 2

    La chiamata ajax è asincrono. Probabilmente non è finito in esecuzione quando si chiama:

    var somevar = dataStore.getXml();
    Credo di si. Chiedendo perché l’utente accetta soluzione.

    OriginaleL’autore ozczecho

  3. 1

    Bene questa è la mia prima Risposta, ma qui si va.

    Ho sbatte la testa contro questo problema me stessa e ho imparato questo.

    Quando si definisce una variabile al di fuori di una funzione, è sempre aggiunto alla ‘finestra’ oggetto.

    quindi, se facciamo questo:

        var myValue;
        function setValue()
        {
            myValue = "test";
        }
        //Assuming setValue() has been run
        function getValue()
        {
            alert(window.myValue); //yup, it's "test"
        }

    Quindi se possiamo usare questa conoscenza per negozio $.ajax dati in una variabile andrà come questo.

        var xml;
    
        $.ajax({
            type: "GET",
            url: "/?do=getcontentadm1n&category=homepage",
            dataType: "json",
            success : function(data) {
                window.xml = data;
            }
        });
    
        alert(window.xml);

    Penso che questo sarà chiaro abbastanza molto per molte persone e per arrivare alla risposta.
    Grazie per aver letto la mia risposta e la fonte: http://snook.ca/archives/javascript/global_variable

    MODIFICA:
    Come detto nel commento qui sotto, questo funziona solo quando async = false.

    questo non funziona con async. solo dove async = false;

    OriginaleL’autore Cariah

  4. 0

    @ggreiner: scordatevi di usare le funzioni di variabili. Stai confondendo gli altri utenti.

    Sono un po ‘ arrabbiato, ma niente di personale, NON ci sono soluzioni su Internet disponibile per memorizzare AJAX dati in vars e il loro utilizzo in eventi.

    SENZA l’UTILIZZO DI FUNZIONI di VARIABILI come il var dataStore = (function(){. Questo comporta ulteriori server di richieste ogni volta che avete bisogno di dati.

    Qui è il codice per la chiamata ajax una VOLTA e utilizzare i suoi dati per altri eventi, funzioni. Che è stato il CONCERTO PRINCIPALE del 99% degli utenti di chiedere questo

    $(document).ready(function() {
        var html; //DEFINE VARS
        var css;
        var js;
    
        $('.editbutton').live('click', function() {
            $.ajax({
                async   : false, //!!!MAKE SURE THIS ONE IS SET!!!
                type    : "GET",
                url : "/?do=getcontent",
                data    : { category: category },
                dataType: 'json',
                success : function(data) {
                    if (data.status == 'ok') {
                                    html = data.html; //!!!STORE!!!
                                    css = data.css;  //!!!STORE!!!
                                    js = data.js;  //!!!STORE!!!
                    }
                    if (data.status == 'error') {
                        alert('ERROR!');
                    }
                }
            });
        });
    
        //CALL ANY STORED VARIABLE FROM ANYWHERE
    
        $('.otherbutton').live('click', function() {
            alert(html); alert(css); alert(js);
        });
    
    });
    tutti quei tappi, rendendo la vostra risposta molto più difficile da prendere sul serio. Inoltre, hai sbagliato “questo sarà chiamata aggiuntive richieste al server ogni volta che avete bisogno di dati”, leggere di nuovo il codice e capire. Fa solo una richiesta. Con riferimento a questa soluzione, è sbagliato. Cosa succede se l’utente fa clic .otherbutton prima cliccando editbutton. In questo caso i dati non sono stati caricati, e sarà null.
    Perché non si fanno 1 anno post di commento?

    OriginaleL’autore Alex G

  5. 0

    Basta usare un 'async:false' Ajax e non all’utente var parola chiave per la realizzazione di risposta Globale.

    OriginaleL’autore KouchakYazdi

Lascia un commento