Backbone.js客户端模型保存服务器端错误的问题

想知道有没有人可以帮助我。

我在运行backbone.js的客户端上有一个页面

服务器正在运行socket.io。

我已经用backbone.iobind同步replace骨干默认同步来支持socket.io。

我有一个骨干模型,保存从服务器(这是计划)得到一个错误响应,并触发保存的错误function, 但我的模型在客户端仍然更新到新值 。 我已经包括等待:从我理解的等待更新之前,从服务器的成功响应的真实,但是这不会发生在我身上。

服务器端socket.io代码

io.sockets.on('connection', function (socket) { socket.on('test:create', function (data, callback) { //err - used to fake an error for testing purposes var err = true; if (err) { // error callback('serv error'); } else { // success // The callback accepts two parameters: error and model. If no error has occurred, send null for error. callback(null, data); } }); 

客户端代码

  //HTML Code //<div id="callBtns"> //<button id="runTest">Create</button> //</div> var CommunicationType = Backbone.Model.extend({ defaults: { runTest: 'default' }, urlRoot : '/test', validate: function(attrs) { //return 'error'; } }); var BasicView = Backbone.View.extend({ el: $('#callBtns'), initialize: function(){ _.bindAll(this); }, events: { "click #runTest": "runTestFn" }, runTestFn: function() { //causing the issue? communicationType.set({runTest: 'value from set'}); communicationType.save({},{ success:function(model, serverResponse){ console.log('Success'); console.log(serverResponse); }, error:function(model, serverResponse){ console.log('Error'); console.log(serverResponse); console.log(JSON.stringify(communicationType)); }, wait: true }); } }); var communicationType = new CommunicationType(); var basicView = new BasicView(); 

我注意到,这个问题看起来是由于我使用set直接更新我的模型communicationType.set({runTest:'set from set'});

如果在保存之前我没有设置任何值,并直接传递值来保存,就像在下面的代码中一样,它可以正常工作

 communicationType.save({runTest: 'value from save'},{ success:function(.... 

然而,这意味着我不能设置任何新的值/更新我的模型,而不通过保存function:/

所以我的问题是,我怎么能得到这个工作正常(获取客户端模型不更新,如果有一个服务器端的错误),而仍然能够使用集?

任何答案真的很感激! 非常感谢

这是做不到的,因为你的模型无法知道它的数据是否有效直到发出请求(在这种情况下是model.save)。

如果要在传递无效值时阻止Backbone.Model.set工作,则必须更新模型的“validation”函数以检查错误。

鉴于以下validationfunction:

 validate: function(attrs) { this.errors = []; if (attrs.runTest === 'wrong_value') { this.errors.push('error message'); } return _.any(this.errors) ? this.errors : null; } 

在您的CommunicationType模型上。 在BasicView中运行此代码:

 communicationType.set({runTest: 'wrong_value'}); 

不会改变模型。

您也可以使用validate函数来检查服务器端错误,方法是返回错误数组并检查它:

 validate: function(attrs) { this.errors = []; if (attrs.runTest === 'wrong_value') { // client side check this.errors.push('error message'); } if (attrs.errors && attrs.errors.length > 0) { // server side check for (var key in attrs.errors) { this.errors.push(attrs.errors[key]); } } return _.any(this.errors) ? this.errors : null; } 

但是这只能防止保存时更改模型。

作为替代scheme,您可以在validation函数中添加服务器请求,以检查错误并防止“set”函数更改模型。

你可以使用silent: true set silent: true所以它不会触发change事件。