backbone.js - libreria - Backbone guarda el modelo éxito y error
underscore empty object (3)
Backbone devuelve una promesa.
Esto es lo que tengo para que funcione.
save({wait: true}).success(function(data){
console.log(data); //returned data from server
}).error(function(error){
console.log(error); //error returned from server
});
Tengo este código de red troncal, creo una vista y un modelo, y llamo al método de guardar para guardar datos en la base de datos:
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();
});
Y el código php para recibir datos es el siguiente:
<?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 que tengo es que cuando se llama a la función de error, el modelo devuelto por el servidor todavía tiene atributos modificados. Me pregunto por qué sucede esto y cómo puedo asegurarme de que si ocurre un error, el modelo se mantiene sin cambios.
Otra pregunta está en el código php, cuando la consulta de SQL es exitosa, si hago eco de 200 o ''200'', la red troncal tendrá éxito, pero si hago eco de una cadena, la red troncal llamará error, me pregunto cuál es la lógica detrás. eso.
De los documentos de la columna vertebral:
Pase {wait: true} si desea esperar al servidor antes de configurar los nuevos atributos en el modelo.
Si no desea que el modelo se actualice hasta que la operación de guardado sea exitosa, pase la wait: true
como una opción.
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
});
La columna vertebral
save( so are others like fetch, update...)
devuelve una promesa. Puedes usar
save().done(
function( data ) {}, // success
function( err ) {} // fail
)
Al igual que cómo maneja las promesas. Se garantiza que el método done()
se ejecutará después de que el servidor haya devuelto cosas.
Consulte la documentación de la API de jQuery para AJAX.jqXHR para obtener más información.