Ajax Backbone.js Backbone.wraperor函数
这个问题是关于主干0.9.2的 升级到主干网0.9.10后,我们选择覆盖主干网.sync,它的工作方式很有魅力。Ajax Backbone.js Backbone.wraperor函数,ajax,backbone.js,Ajax,Backbone.js,这个问题是关于主干0.9.2的 升级到主干网0.9.10后,我们选择覆盖主干网.sync,它的工作方式很有魅力。 2012年12月-(v0.9.9)主干网已删除 2013年2月-看起来WrapError将在下一版本的主干网中重新推出,但覆盖主干网.sync是一条可行之路 (抱歉读了这么长时间) 我正在修改Backbone.wraperor函数,我被一行代码弄糊涂了。我知道这条线的作用,但不知道为什么它是必要的 resp = model === originalModel ? resp
- 2012年12月-(v0.9.9)主干网已删除
- 2013年2月-看起来WrapError将在下一版本的主干网中重新推出,但覆盖主干网.sync是一条可行之路
(抱歉读了这么长时间) 我正在修改Backbone.wraperor函数,我被一行代码弄糊涂了。我知道这条线的作用,但不知道为什么它是必要的
resp = model === originalModel ? resp : model;
- resp最终成为textStatus/errorType,即:“error”“timeout” “分析错误”
- 模型是XHR请求对象
- originalModel是对最终调用此函数的主干.Model实例的引用
主干网的文档说明Wraperor将“用回退错误事件包装可选错误回调”,这是正确的。此外,我还了解到,为了确保库不会忽略AJAX错误,库中会从fetch、save、destroy和reset函数中调用Backbone.wraperor 4次。例如,如果AJAX错误回调被传递到fetch方法中,它将使用传递的几个参数执行,否则,模型将使用传递的相同的几个参数触发错误事件 电话示例:
options.error = Backbone.wrapError(options.error, model, options);
主干网.wraperor:
Backbone.wrapError = function(onError, originalModel, options) {
return function(model, resp) {
resp = model === originalModel ? resp : model;
if (onError) {
onError(originalModel, resp, options);
} else {
originalModel.trigger('error', originalModel, resp, options);
}
};
};
这行(resp=model===originalModel?resp:model;
)出现的问题是model和resp对应于jQuery/Zepto错误回调参数列表中的前两个参数。我遇到的第一个问题是这些参数(model、response)的命名,因为在调试时我看到这两个参数是jqXHR/xhr
和textStatus/errorType
。textStatus/errorType参数通常以“error”结束,但(根据文档)也可以是“timeout”“parse error”等。比较model===originalModel
对我来说没有意义。XHR对象和主干上的一个硬比较。模型实例将始终失败,Model
将存储到response
(resp)中,这很好,因为Model
实际上就是XHR响应对象。。。这一行对我来说似乎毫无意义,但我继续将其包含在修改后的Wraperor方法中
由于model===originalModel
的计算结果总是为false,因此该行似乎是resp=model的一个精心设计的版本;这是无用的,因为您可以完全删除该行,而model
参数可以传递到originalModel.trigger('error',originalModel,resp,options)中代码>而不是resp
是否存在model===originalModel
可能计算为true的实例?
任何对Backbone.js、AJAX有更多经验的人都可以回答/解释为什么需要这一行?TLDR/CLIFFS:
下面这条奇怪的小行用于确定错误回调是由模型级别的失败验证触发的,还是由fetch、save或destroy方法(都调用Backbone.sync)的失败AJAX调用触发的。如果失败来自验证,则不会更改resp变量,因为resp应该已经包含验证返回的有用信息(例如错误数组或有关错误的字符串)。如果失败来自错误的AJAX请求,那么XHR对象将存储到resp中,因为XHR是可用信息量最大的项目。不幸的是,XHR被传递到这个函数中,因为模型和主干文档没有指出这个参数并不总是表示模型。Resp用于保存有关错误的有用响应信息,并发送到错误回调或抛出的错误事件
好的。我从这条奇怪的线路中学到了一些东西
resp = model === originalModel ? resp : model;
主干中存在AJAX错误和验证错误。方便的是,主干将这两个错误导入同一个函数——AJAX错误回调。问题是传入这些函数的参数不一致。当出现AJAX错误时,XHR对象可用,但在验证错误期间不可用
- 如果不存在回调,主干将抛出和“error”事件,其参数与传递到错误回调中的参数相同。(下面第7行和第9行)
AJAX请求成功后,可以选择通过模型的validate函数传递JSON数据。在主干网中,如果没有错误,验证函数应该返回false或什么都不返回。当出现错误时,通常会返回一个数组,例如[“无效用户名”,“密码太长”,“等等]
从validate(通常是错误消息数组)返回的任何内容都将作为resp
参数传递到“包装”错误回调中,模型本身作为模型
传递
_validate函数有点草率,它有多个返回语句,但当验证失败时,会命中第9行。\u validate
函数的第9行传递此
(模型),错误
(从模型验证方法返回),选项
(ajax选项、成功、错误、超时等)。这与AJAX错误不同,AJAX错误将传入xhr
(xmlhttprequest对象)、errorType
(“错误”“超时”“解析错误”等)、选项(AJAX选项)
上面奇怪的代码行是必要的,因为这一个函数处理来自2DIF的错误
validate error: error(model, validate_return_value, options)
ajax error: error(xhr, errorType, options)
1 _validate: function(attrs, options) {
2 if (options.silent || !this.validate) return true;
3 attrs = _.extend({}, this.attributes, attrs);
4 var error = this.validate(attrs, options);
5 if (!error) return true;
6 if (options && options.error) {
7* options.error(this, error, options);
8 } else {
9 this.trigger('error', this, error, options);
10 }
11 return false;
12 }
Backbone.wrapError = function(ajax_error_callback, model_or_xhr, ajax_options) {
return function(model_or_xhr, error_info) {
if there was an ajax error, error_info = the xhr object
if there was a validation error, error_info = whatever was returned from validate
if there's an error callback {
run the error callback with (the original model, error_info, ajax_options) as parameters
if there is not an error callback
throw an event called 'error' with (the original model, error_info, ajax_options) as parameters
}
};
};
Backbone.wrapError = function(onError, originalModel, options) {
return function(model, resp) {
resp = model === originalModel ? resp : model;
if (onError) {
* onError(originalModel, resp, options);
} else {
originalModel.trigger('error', originalModel, resp, options);
}
};
};