2013-04-29 75 views
15

我有这样的骨干代码,创建一个视图和模型,并调用保存方法将数据保存到数据库:骨干节省模式的成功和错误

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

和接收数据的PHP代码如下:我有

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

?> 

的一个问题是,当误差函数被调用时,模型从服务器仍然有修改的属性返回。我想知道为什么会发生这种情况,我如何确保如果发生错误,模型保持不变。

另一个问题是在php代码中,当sql查询成功时,如果我回显200或'200',主干会调用成功,但如果我回显一个字符串,主干会调用错误,我想知道它背后的逻辑是什么。

回答

27

backbone docs:

通行证{等待:真正}如果你想在模型上设置 新属性之前等待服务器。

如果您不希望模型更新,直到保存成功后全部通过wait: true作为选项。

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的链接文档 – 2013-07-16 02:52:24

7

的骨干

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

返回一个承诺。您可以使用

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

就像您如何处理承诺一样。 done()方法保证在服务器返回东西后执行

查看jQuery API docs for AJAX.jqXHR了解更多信息。

+0

是不是'.done'为'.success'的代名词?似乎你正在寻找'.always' http://api.jquery.com/jquery.ajax/ – KFunk 2017-09-26 00:11:27

2

Backbone返回一个承诺。

这是我得到它的作品。

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