2013-04-29 15 views
15

Ho questo codice spina dorsale, creare una vista e il modello, e chiama il metodo Save per salvare i dati nel database:Backbone Salva il successo del modello e l'errore

var form = document.forms[0]; 

var RetailerModel = Backbone.Model.extend({ 
    urlRoot: ' retailer.php', 
    defaults: { 
     name: 'company-name', 
     address: 'company-address', 
     phone: 'company-phone', 
     icon: 'http://localhost/icon.png' 
    } 
}); 

var RetailerCollection = Backbone.Collection.extend({ 

}); 

var RetailerView = Backbone.View.extend({ 

    className: 'retailer', 

    template: _.template($('#retailer-template').html()), 

    initialize: function() { 

     var obj = { 
      name: form.name.value, 
      address: form.address.value, 
      phone: form.phone.value 
     }; 

     var o = this; 

     this.model.save(obj, { 
      success: function(model, response) { 
       console.log(model); 
       console.log(response); 
       o.render(); 
       console.log('success'); 
      }, 
      error: function(model, response) { 
       console.log(model); 
      } 
     }); 
    }, 

    render: function() { 
     $('#retailer-list').append(this.$el.html(this.template(this.model.toJSON()))); 

     return this; 
    } 
}); 

var RetailerViews = Backbone.View.extend({ 

}); 

$('#submit').click(function(e){ 
    var retailer_model = new RetailerModel(); 
    var retailer_view = new RetailerView({model: retailer_model}); 
    form.reset(); 
}); 

E il codice php per la ricezione dei dati è la seguente:

<?php 
$connect = mysql_connect('127.0.0.1','root','xxxxxx'); 
if (!$connect) { 
    die('Could not connect: ' . mysql_error()); 
} 

mysql_select_db("retail", $connect); 
if($_SERVER['REQUEST_METHOD'] == 'POST') //POST GET PUT DELETE 
{ 
    $data = json_decode(file_get_contents('php://input'), true); 
} 

$name  = $data['name']; 
$address = $data['address']; 
$phone  = $data['phone']; 
$icon  = $data['icon']; 

if(!(mysql_query("INSERT INTO retailer (name, address, phone, icon)VALUES ('".$name."', '".$address."','$phone', '".$icon."')"))) 
{ 

    echo 200; 
} 
else{ 
    echo 'record has not been insert to db'; 
} 

mysql_close($connect); 

?> 

Un problema che ho è che quando viene chiamata la funzione di errore, il modello restituito dal server ha ancora attributi modificati. Mi chiedo perché questo sta accadendo e come posso assicurarmi che se si verifica un errore, il modello rimane invariato.

Un'altra domanda è nel codice php, quando la query sql ha esito positivo, se faccio eco 200, o '200', backbone chiamerà successo, ma se echo una stringa, backbone chiamerà errore, mi chiedo qual è la logica dietro di esso.

risposta

27

Dal backbone docs:

Passo {attesa: true} se si desidera attendere che il server prima di impostare i nuovi attributi al modello.

Se non si desidera aggiornare il modello fino a quando il salvataggio non ha esito positivo passaggio completo wait: true come opzione.

this.model.save(obj, { 
     success: function(model, response) { 
      console.log(model); 
      console.log(response); 
      o.render(); 
      console.log('success'); 
     }, 
     error: function(model, response) { 
      console.log(model); 
     }, 
     wait: true // Add this 
    }); 
+1

+1 per il collegamento ai documenti –

7

la spina dorsale

save(so are others like fetch, update...) 

restituisce una promessa. È possibile utilizzare

save().done( 
    function(data) {}, // success 
    function(err) {} // fail 
) 

proprio come si gestiscono le promesse. Il metodo done() è garantito per l'esecuzione di dopo che il server ha restituito il materiale.

Vedere jQuery API docs for AJAX.jqXHR per ulteriori informazioni.

+0

Non è ".done' un sinonimo di" .successo "? Sembra che stavi cercando '.always' http://api.jquery.com/jquery.ajax/ – KFunk

2

Backbone restituisce una promessa.

Ecco quello che devo farlo funzionare.

save({wait: true}).success(function(data){ 
    console.log(data); //returned data from server 
}).error(function(error){ 
    console.log(error); //error returned from server 
}); 
Problemi correlati