backbone.js使用不同的url进行模型保存和获取

时间:2011-10-04 07:55:33

标签: backbone.js

我的后端有两个单独的页面,一个用于处理模型保存请求,另一个用于模型提取。

调用save()和fetch()以使用不同的URL的最佳方法是什么?感谢。

修改 在研究了带注释的源代码后,我发现实际上可以向fetchsave提供options哈希

//taken from backbone source:
save : function(attrs, options) {
  options || (options = {});
  if (attrs && !this.set(attrs, options)) return false;
  var model = this;
  var success = options.success;
  options.success = function(resp, status, xhr) {
    if (!model.set(model.parse(resp, xhr), options)) return false;
    if (success) success(model, resp, xhr);
  };
  options.error = wrapError(options.error, model, options);
  var method = this.isNew() ? 'create' : 'update';
  return (this.sync || Backbone.sync).call(this, method, this, options);
},

在保存中,attrs的目的是什么?我刚刚调用myModel.save()而没有传入任何内容,而且它总是正确地散列我的模型的属性。但现在我想提供一个“保存网址”,我很想打电话给

myModel.save(undefined, {
    url: 'myPath'
})

未定义需要“跳过”第一个attrs参数。

4 个答案:

答案 0 :(得分:72)

如果您正在阅读源代码,那么您可能已经有了可行的解决方案。你基本上有两个选择(可能更多) -

  1. 在save()/ fetch()
  2. 中传递网址

    save()接受两个参数attr和options  attr - 是模型属性的哈希值,用于在保存之前更新模型。 例如。

    myModel.save(attrs)
    

    相当于

    myModel.set(attrs)
    myModel.save()
    

    第二个参数是一个选项哈希,它传递给this.sync()(然后是Backbone.sync,然后是$ .ajax) - 设置此哈希中的url将按预期工作。 您可以传递false,undefined或{}作为跳过更新的第一个参数。

    1. 覆盖Backbone.sync
    2. 每次调用save()或fetch()编写自己的同步函数来为你计算url时,不要让url散布在整个代码中,而是委托给原来的Backbone.sync进行繁重的工作

      例如。 (此同步功能在CREATE,UPDATE和DELETE操作上添加/保存到URL)

      function mySyncFunction(method, model, options){
        if(method=='GET'){
          options.url = model.url; 
        }else{
           options.url = model.url + '/save'; 
        }
        return Backbone.sync(method, model, options);
      }
      

      要使用自定义同步方法,只需将其声明为模型的一部分

      var myModel = Backbone.Model.extend({ 
        ...
      
        "sync": mySyncFunction,
      
        ...
      });
      

答案 1 :(得分:24)

Gingerhendrix的答案涵盖了基础,但我认为值得详细说明传递save / delete / fetch的选项值的方法。

您可以在模型上覆盖方法,而不是在您调用其中一种方法的网址上乱丢您的代码,而不是像这样委托回原始的Backbone.Model方法:

var MyModel = Backbone.Model.extend({
  save: function(attributes, options) {
    options = _.defaults((options || {}), {url: "http://your.save.url.com/"});
    return Backbone.Model.prototype.save.call(this, attributes, options);
  },
  // same thing for fetch and delete to give them different urls...
}

然后,您可以在代码中调用该方法,而无需担心记住在选项中设置url

答案 2 :(得分:9)

我想澄清@gingerhendrix的答案:你可以将url传递给save中的选项,它会直接转到xhr请求(从文档或源代码或答案中不明显,所以我发布ot作为单独的答案) :

model.save({}, {url: '/custom-url'});

答案 3 :(得分:2)

如果你有一个模型和一个集合,如: -

MyModel = Backbone.Model.extend({

url: function(){ "API/"
      return "API/MyModel/" +this.get("id");
    }
});

MyCollection = Backbone.Collection.extend({
    model: MyModel ,
    url: "API/MyModels"
});

获取集合只需调用

MyCollection.fetch({
       success: function(){
       //do something here
       },
       error: function(){
       //Handle your error
       }
});

要假设您拥有模型的ID,请保存模型 你已经实例化了你的集合(称之为myCollection)。

var model = myCollection .get(id);
   model.save(
                             model.attributes,
                                {
                                    success: function (model, response) {

                                        //do something on success
                                    },
                                    error: function (model, response) {
                                       //handle the error
                                    }
                                }
                            );