这个问题是关于 Backbone 0.9.2
自从升级到 Backbone 0.9.10 后,我们选择覆盖 Backbone.sync,它就像一个魅力。
- 2012 年12 月- (v0.9.9) Backbone.wrapError 已被删除。
- 2013 年2 月- 看起来 WrapError 将在 Backbone 的下一个版本中恢复,但覆盖主干.sync 是要走的路。
(抱歉读了很久)
我正在修改 Backbone.wrapError 函数,我被一行字弄糊涂了。我知道这条线的作用,但不知道为什么它是必要的。
resp = model === originalModel ? resp : model;
- resp 最终成为 textStatus/errorType 即:“错误”“超时”“解析错误”
- model 是 XHR 请求对象
- originalModel 是对最终调用此函数的 Backbone.Model 实例的引用
我很好地掌握了 Backbone.wrapError 的作用、返回的内容以及使用方式,但我似乎无法理解上述行的目的。
Backbone 的文档指出 wrapError 将“使用回退错误事件包装可选的错误回调”,这是真的。此外,我了解到 Backbone.wrapError 在库中从 fetch、save、destroy 和 reset 函数中调用了 4 次,以确保库不会忽视 AJAX 错误。例如,如果将 AJAX 错误回调传递给 fetch 方法,它将使用传递的几个参数执行,如果没有,模型将使用传递的相同的几个参数触发错误事件。
示例调用:
options.error = Backbone.wrapError(options.error, model, options);
Backbone.wrapError:
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 错误回调参数列表中的前 2 个参数。我遇到的第一个问题是这些参数(模型、响应)的命名,因为在调试时我已经看到这两个参数是jqXHR/xhr
and textStatus/errorType
。textStatus/errorType 参数通常最终是“错误”,但(根据文档)也可以是“超时”“解析错误”等。比较model === originalModel
对我来说毫无意义。对 XHR 对象和 Backbone.Model 实例的硬比较总是会失败,并且model
会存储到response
(resp) 中,这很好,因为model
实际上是 XHR 响应对象...这行对我来说似乎毫无意义,但我继续将其包含在我修改后的 wrapError 方法中。
因为model === originalModel
总是评估为假,所以该行似乎是 resp = model; 的复杂版本。这是没用的,因为您可以完全删除该行,并且model
可以将参数传递给originalModel.trigger('error', originalModel, resp, options);
而不是resp
.
有没有model === originalModel
可能评估为真的实例?
任何在 Backbone.js、AJAX 方面有更多经验的人都可以回答/解释为什么这条线是必要的?