Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ajax Backbone.js Backbone.wraperor函数_Ajax_Backbone.js - Fatal编程技术网

Ajax Backbone.js Backbone.wraperor函数

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

这个问题是关于主干0.9.2的

升级到主干网0.9.10后,我们选择覆盖主干网.sync,它的工作方式很有魅力。

  • 2012年12月-(v0.9.9)主干网已删除
  • 2013年2月-看起来WrapError将在下一版本的主干网中重新推出,但覆盖主干网.sync是一条可行之路

(抱歉读了这么长时间)

我正在修改Backbone.wraperor函数,我被一行代码弄糊涂了。我知道这条线的作用,但不知道为什么它是必要的

  resp = model === originalModel ? resp : model;
  • resp最终成为textStatus/errorType,即:“error”“timeout” “分析错误”
  • 模型是XHR请求对象
  • originalModel是对最终调用此函数的主干.Model实例的引用
我很好地掌握了Backbone.wraperor的功能、返回的内容以及如何使用它,但我似乎无法理解上面这行的目的


主干网的文档说明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);
        }
      };
    };