有人可以解释这个代码的工作原理吗?

问题描述:

我很难获得backbone.js的创建功能。我的主要问题,nextModel,resp,xhr是从哪里来的? 我认为它应该做coll.add(model)('因为我们正试图添加一个模型到集合中)。有人可以解释这个代码的工作原理吗?

谢谢。

create : function(model, options) { 
    var coll = this; 
    options || (options = {}); 
    model = this._prepareModel(model, options); 
    if (!model) return false; 

    var success = options.success; 

    options.success = function(nextModel, resp, xhr) { 
     coll.add(nextModel, options); 
     if (success) success(nextModel, resp, xhr); 
    }; 
    model.save(null, options); 
    return model; 
}, 

UPDATE: 这是我学到以下从shesak线索。我追踪了它,从创建到保存,然后到Backbone.sync。 Jquery中的options.success将对应于此。

success(data, textStatus, jqXHR)Function, Array 

如果请求成功,则调用该函数。根据dataType参数

  • 字符串描述状态
  • 和jqXHR(jQuery中1.4.x中,XMLHttpRequest的)对象

    • 数据从服务器返回的,格式化:这个函数会得到三个参数。

    从jQuery 1.5开始,成功设置可以接受一组函数。每个函数都会依次调用。这是一个Ajax事件。这意味着,nextModel将来自success(data, textStatus, jqXHR)的数据。

  • +0

    不完全。调用成功回调函数的代码是'Backbone.Model#save',它通过一个'Backbone.Model'对象加载提供给'Backbone.Collection#create'的数据,并与来自服务器的JSON响应合并,而不是实际的AJAX响应。 – shesek

    +0

    @ Shesek,所以它添加我给它的模型集合或添加从服务器响应该集合的模型。 –

    +0

    @ Shesek,到目前为止,我在SAVE的options.success中收到了服务器的响应,并且我可以警告响应。然而,“成功”状态并没有转移回CREATE,所以它的成功功能没有被调用。 –

    options对象,与success回调一起,被传递到Backbone.Model#save,节省了success回调的副本,与它自己的回调覆盖它并调用Backbone.sync,最终调用$.ajax与整个options对象。它的jQuery(或Zepto's)代码最终调用(覆盖的)options.success以及来自服务器的JSON响应。

    重载的成功回调set()是服务器对模型的响应(服务器在保存模型后,可以返回它的整个模型,或者只返回JSON格式的一些属性。这样做是为了允许服务器在保存模型时修改或标准化模型[如添加新创建的ID]),并将更改后的模型(该更改后的模型称为nextModel)传递回保存的原始success回调(在Backbone.Collection#create中定义的回调),它将nextModel(从Backbone.Model#save经过服务器的JSON响应修改后传递)添加到集合中。


    如果你只是想一个模型添加到集合,而不被服务器保存它的持久性存储,调用Backbone.Collection#add,而不是直接创造。

    function(nextModel, resp, xhr) 
    

    是匿名函数,当执行成功并且参数netModel,resp,xhr将被传递给它时,它将被调用。

    所以某处模式存在的方法,将调用函数

    options.success(nextMode, resp, xhr) 
    

    和这些变量模型

    +0

    您的答案和@ctcherry的答案都不涉及这个问题;检查代码,'nextModel'只存在于这个函数中,并没有在其他地方定义。它在哪里分配,为什么被使用? – eykanal

    +0

    我对整个Backbone.js进行了搜索... nextModel只出现在这里。它从哪里来的? –

    +0

    nextModel是参数的名称,所以它可以在模型“x”或“j”或“xxx”或其他任何地方被调用。 –

    您参考的变量nextModel, resp, xhr到的参数的函数定义。在代码点之后就被创建functuon并分配给options.success

    ,整个options对象被传递到model.save,我想象一些处理发生,也许这options.success函数被调用,并且3个参数传递到它在那一点上。