骨干保存没有设置回调
我在我的网络应用程序中有一个拖放功能。 当用户在拖放之后释放鼠标时,使用模型上的Backbone的save()方法将对象的位置保存到服务器。 当服务器响应时,它会使用返回的属性在模型上触发set()。 但是,在服务器处理请求的时候,用户可能已经再次将对象拖动到不同的位置。 这会导致问题,因为服务器的响应现在会覆盖浏览器中对象的设置。
有没有办法阻止Backbone在执行save()之后从服务器获得响应之后执行set()?
虽然之前做系统的时候有过类似的用例,但是更麻烦,因此我们需要真正覆盖set()
函数。 虽然在这种情况下可以使用一些相对较简单的方法。
您可以重写模型parse()函数。 或者,您可以在save()
调用返回的jqXHR对象上调用abort()
。
http://api.jquery.com/jQuery.ajax/#jqXHR
查看“等待”选项,默认情况下它应该设置为false,这意味着应该在调用save()后立即设置模型字段。 您可以设置{wait:true}在设置更新的模型字段值之前让骨干等待服务器回复。
从您描述的行为看,您的应用程序中的wait选项设置为true。
更多细节:http://backbonejs.org/#Model-save
另一个需要记住的重要事情是骨干网仅设置从被调用的Web服务返回的更新字段的子集,所以如果您不返回任何内容,则将被设置。
在实际设置之前, Model.save
将会使用相同的options
参数调用Model.parse
。
您可以使用自定义标志(让我们说position: true
)来调用Model.save
,指出Model.parse
可以放弃服务器返回的内容。
例如,假设你的坐标是x
和y
var M = Backbone.Model.extend({
parse: function(data, options) {
if (options && options.position)
data = _.omit(data, 'x', 'y');
return data;
}
});
var m = new M();
m.save({x: 10, y:10}, {position: true});
m.save({x: 20, y:20}, {position: true});
和一个演示http://jsfiddle.net/nikoshr/YwC7q/
链接地址: http://www.djcxy.com/p/67075.html