2010-02-08 20 views
15

In questo momento, la risposta del server su cui sto lavorando con restituisce una risposta JSON come questo:JEditable, come gestire una risposta JSON?

{"status":1} 

Dopo il salvataggio, i luoghi jeditable la risposta effettiva: {"status":1} sulla pagina. Ad ogni modo per aggirare questo problema?

+0

La variabile "valore" nel callback, descritta nella risposta di Felipe, contiene la risposta del server. Quindi puoi fare quello che vuoi con esso nella richiamata. Ho utilizzato la risposta JSON del mio server per inserire il testo visualizzato nella pagina per l'utente e anche per determinare altre modifiche sulla pagina. –

risposta

0

Quindi la soluzione mi è venuta è simile a quello che madcapnmckay answered here.

var editableTextArea = $('.editable-textarea'); 
     editableTextArea.editable(submitEditableTextArea, { 
    type  : 'textarea', 
    cancel : 'Cancel', 
    submit : 'Save', 
      name   : editableTextArea.attr('id'), 
      method  : 'post', 
      data   : function(value, settings) { 
             return $.fn.stripHTMLforAJAX(value); 
            }, 
      event  : "dblclick", 

    onsubmit : function(value, settings) { 
       //jquery bug: on callback reset display from block to inline 
       $('.btn-edit').show(0, function(){$(this).css('display','inline');}); 
       }, 
    onreset  : function(value, settings) { 
       //jquery bug: on callback reset display from block to inline 
       $('.btn-edit').show(0, function(){$(this).css('display','inline');}); 
       } 
    }); 

Allora la funzione url è

function submitEditableTextArea(value, settings) { 
         var edits = new Object(); 
         var result = $.fn.addHTMLfromAJAX(value); 
         edits[settings.name] = [value]; 
         var returned = $.ajax({ 
          type   : "POST", 
          data   : edits, 
          dataType : "json", 
          success  : function(_data) { 
           var json = eval(_data); 
           if (json.status == 1) { 
            console.log('success'); 
           } 
          } 
         }); 
         return(result); 
        } 
23

Una soluzione migliore è quella di post-elaborazione dei dati JSON restituiti prima di esso colpisce la pagina.

Supponiamo che il server restituisce la seguente stringa JSON:

{ "status": 1, "result": "value to be displayed", "other": "some other data" } 

e si vorrebbe elaborare il "stato" e "altri" campi, e visualizzare il campo "risultato" nel campo di immissione jeditable.

Aggiungere le seguenti 2 linee a jquery.jeditable.js:

(attorno alla riga 95):

var intercept = settings.intercept || function(s) {return s; }; 

(attorno alla riga 350, subito dopo "il successo: la funzione (risultato, stato) { "

result = intercept.apply(self,[result]); 

Poi, nel proprio codice, fare qualcosa di simile al seguente:

$(some_field).editable(
'/some_url_on_your_server', 
{ 
    indicator : "<img src='/images/spinner.gif'>", 
    tooltip: "Click to edit.", 
    indicator: "Saving...", 
    onblur: "submit", 
    intercept: function (jsondata) { 
     obj = jQuery.parseJSON(jsondata); 
     // do something with obj.status and obj.other 
     return(obj.result); 
    }, 
    etc. 

Questo ti permette di fare cose interessanti come avere il tuo server convertire le abbreviazioni in stringhe piene ecc.

Divertiti!

+0

Bello, funziona molto bene –

+9

Mi viene in mente che questo non esiste nel plug-in per impostazione predefinita. Grazie per l'aiuto. – siliconrockstar

+0

D'accordo: dovrebbe essere nel plugin in quanto è estremamente utile per un sacco di casi d'uso. – northernman

2

Ecco come ho gestito la risposta JSON.

Innanzitutto, impostare il tipo di dati utilizzando ajaxoptions. Quindi, gestisci i tuoi dati nella funzione di callback. In questo, this.revert è il tuo valore originale.

oTable.$('td:eq(3)').editable('/admin/products/add_quantity_used', { 
    "callback" : function(sValue, y) { 
     var aPos = oTable.fnGetPosition(this);   
     if($("#dialog-message").length != 0){ 
      $("#dialog-message").remove(); 
     } 
     if(!sValue.status){ 
     $("body").append('<div id="dialog-message" style="display:none;">'+sValue.value+'</div>'); 
     $("#dialog-message").dialog({ 
      modal: true, 
      buttons: { 
       Ok: function() { 
        $(this).dialog("close"); 
       } 
      } 
     }); 
     if(this.revert != '') 
      oTable.fnUpdate(this.revert, aPos[0], aPos[1]); 
     else 
      oTable.fnUpdate("click to edit", aPos[0], aPos[1]); 
     }else 
     if(sValue.status) 
      oTable.fnUpdate(sValue.value, aPos[0], aPos[1]); 


    }, 
    "submitdata" : function(value, settings) { 
     return { 
      "data[users_to_products][users_to_products_id]" : this.parentNode.getAttribute('id'), 
      "column" : oTable.fnGetPosition(this)[2]     
     }; 
    }, 
    "height" : "30px", 
    "width" : "30px", 
    "maxlength" : "3", 
    "name" : "data[users_to_products][quantity_used]", 
    "ajaxoptions": {"dataType":"json"} 
}).attr('align', 'center'); 
+0

Benvenuti in StackOverflow. Si prega di tenere presente che la punteggiatura e la corretta patrimonializzazione aiutano enormemente nella lettura dei post. – phant0m

12

C'è un modo semplice per farlo utilizzando il callback. .editable() converte qualsiasi risposta in una stringa, quindi la risposta deve essere convertita in una variabile JSON. I valori possono quindi essere recuperati e quindi scritti utilizzando un metodo '.text()'. Controllare il codice:

$("#myField").editable("http://www.example.com/save.php", { 
    submit : 'Save', 
    cancel : 'Cancel', 
    onblur : "ignore", 
    name  : "sentText", 
    callback : function(value, settings) { 
     var json = $.parseJSON(value); 
     $("#myField").text(json.sentText); 
    } 
}); 
+2

Questa è un'ottima soluzione, in cui non devo modificare lo script JEditable, thx. –

+2

Stavo per dire che non vedo come funzionerebbe. Nel callback, "valore" si riferisce al valore presentato, non alla risposta. Ma l'ho appena testato e valore IS il valore restituito NON il valore presentato! Nella pagina jeditable (http://www.appelsiini.net/projects/jeditable), viene indicato "Il valore contiene il contenuto del modulo inviato". che non è corretto! (Inoltre, tra l'altro, hai una citazione extra dopo save.php che sta incasinando il tuo codice markup.) –

+0

Risolto il markup. Grazie @ButtleButkus –