内容简介:代码日志版权声明:翻译自:http://stackoverflow.com/questions/5886748/backbone-js-problem-when-saving-a-model-before-previous-save-issues-postcreat
,用户可以非常快速地添加对象,然后通过简单地选择相关字段来开始更新这些对象的属性.我遇到的问题是,有时候用户将服务器打到初始保存状态,我们最终会节省两个对象.
如何重新创建此问题的示例如下所示:
>用户单击添加人员按钮,我们将其添加到DOM中,但是由于我们还没有任何数据,因此不保存任何内容.
person = new Person();
>用户在“名称”字段中输入一个值,并在其中输入选项卡(名称字段失去焦点).这将触发保存,以便我们更新服务器上的模型.由于模型是新的,Backbone.js将自动向服务器发出POST(创建)请求.
person.set({name:’John’});
person.save(); //创建新模型
>然后,用户可以很快地输入他们已经标签的年龄字段,输入20和制表符到下一个字段(年龄因此失去焦点).这再次触发保存,以便我们更新服务器上的模型.
person.set({age:20});
person.save(); //更新模型
所以我们期望在这种情况下一个POST请求来创建模型,一个PUT请求来更新模型.
但是,如果第一个请求仍在处理中,并且在上述第3点的代码已经运行之前还没有响应,那么我们实际获得的是两个POST请求,因此创建了两个对象而不是一个.
所以我的问题是是否有一些最佳实践方法来处理这个问题和Backbone.js?或者,Backbone.js应该有一个用于保存操作的排队系统,以便在该对象的先前请求成功/失败之前不发送一个请求?或者,或者我应该构建一些东西,以便通过发送只有一个创建请求而不是多个更新请求来处理此问题,也许使用某种排序,或者检查Backbone模型是否在请求之间,并等到该请求为完成.
您如何处理这个问题的建议将不胜感激.
我很高兴采取一些刺激实施某种排队系统,虽然你可能需要忍受我的代码,不会像现有的代码库那样形成!
我已经测试和设计了一个补丁解决方案,灵感来自于@Paul和@Julien谁发布在这个线程.这是代码:
(function() {
function proxyAjaxEvent(event, options, dit) {
var eventCallback = options[event];
options[event] = function() {
// check if callback for event exists and if so pass on request
if (eventCallback) { eventCallback(arguments) }
dit.processQueue(); // move onto next save request in the queue
}
}
Backbone.Model.prototype._save = Backbone.Model.prototype.save;
Backbone.Model.prototype.save = function( attrs, options ) {
if (!options) { options = {}; }
if (this.saving) {
this.saveQueue = this.saveQueue || new Array();
this.saveQueue.push({ attrs: _.extend({}, this.attributes, attrs), options: options });
} else {
this.saving = true;
proxyAjaxEvent('success', options, this);
proxyAjaxEvent('error', options, this);
Backbone.Model.prototype._save.call( this, attrs, options );
}
}
Backbone.Model.prototype.processQueue = function() {
if (this.saveQueue && this.saveQueue.length) {
var saveArgs = this.saveQueue.shift();
proxyAjaxEvent('success', saveArgs.options, this);
proxyAjaxEvent('error', saveArgs.options, this);
Backbone.Model.prototype._save.call( this, saveArgs.attrs, saveArgs.options );
} else {
this.saving = false;
}
}
})();
这样做的原因如下:
>当模型上的更新或创建请求方法仍在执行时,下一个请求被简单地放入队列中,以便在调用错误或成功的回调之一时进行处理.
>请求时的属性存储在属性数组中,并传递给下一个保存请求.这意味着当服务器用第一个请求的更新模型进行响应时,来自排队请求的更新的属性不会丢失.
我已经上传了 Gist which can be forked here .
代码日志版权声明:
翻译自:http://stackoverflow.com/questions/5886748/backbone-js-problem-when-saving-a-model-before-previous-save-issues-postcreat
以上所述就是小编给大家介绍的《javascript – Backbone.js – 在上一个保存前保存模型POST(创建)而不是PUT(更新)请求时出现问题》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
操作系统概念(第六版)
(美)西尔伯斯查兹 / 郑扣根 / 高等教育出版社 / 2005-11 / 55.00元
《操作系统概念》(第6版翻译版)是讨论了操作系统中的基本概念和算法,并对大量实例(如Linux系统)进行了研究。全书内容共分七部分。第一部分概要解释了操作系统是什么、做什么、是怎样设计与构造的,也解释了操作系统概念是如何发展起来的,操作系统的公共特性是什么。第二部分进程管理描述了作为现代操作系统核心的进程以及并发的概念。第三部分存储管理描述了存储管理的经典结构与算法以及不同的存储管理方案。第四部分......一起来看看 《操作系统概念(第六版)》 这本书的介绍吧!