【问题标题】:backbone.js use different urls for model save and fetchBackbone.js 使用不同的 url 进行模型保存和获取
【发布时间】:2011-10-04 07:55:32
【问题描述】:

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

调用 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 参数所需的未定义。

【问题讨论】:

  • 致任何发现此问题的人:我发现问题中的答案比任何一个实际答案都更有帮助。

标签: backbone.js


【解决方案1】:

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

  1. 在 save()/fetch() 中传递 URL

save() 有两个参数 attr 和 options attr - 是模型属性的散列,用于在保存之前更新模型。 例如。

myModel.save(attrs)

等价于

myModel.set(attrs)
myModel.save()

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

  1. 覆盖 Backbone.sync

而不是每次调用 save() 或 fetch() 时都将 url 分散在代码中>

例如。 (此同步函数在 CREATE、UPDATE 和 DELETE 操作时将 /save 添加到 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,

  ...
});

【讨论】:

  • 很好的明确答案。在这里覆盖默认同步方法绝对是更好的选择。
  • 仅供参考...使用 .fetch() 时,方法值似乎是“读取”。
  • 从 Backbone 0.9.10 开始:var methodMap = { 'create': 'POST', 'update': 'PUT', 'patch': 'PATCH', 'delete': 'DELETE' , '读': 'GET' };
  • 未捕获的类型错误:对象 [object Object] 的属性“同步”不是函数
  • @gingerhendrix 当您拥有永远不需要保存或更新的只读数据时,最好覆盖默认同步方法?我喜欢你的回答,并希望我的代码尽可能高效。
【解决方案2】:

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

您也可以在模型上覆盖该方法,而不是像这样委托回原来的 Backbone.Model 方法,而不是在每个调用这些方法的地方都用 url 乱扔代码:

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

【讨论】:

  • 我们需要作为属性传递什么——你能提供一个完整的使用例子吗?
【解决方案3】:

我想明确@gingerhendrix 的答案:您可以将 url 传递给保存中的选项,它将直接转到 xhr 请求(从文档或源代码或答案中并不明显,因此我将 ot 作为单独的答案发布) :

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

【讨论】:

【解决方案4】:

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

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
                                    }
                                }
                            );

【讨论】:

  • 这个答案似乎根本没有解决 OP 的实际问题 - 他/她需要将 .save() 转到与 .fetch() URL 不同的 URL。
猜你喜欢
  • 2012-02-02
  • 2018-06-25
  • 2012-03-27
  • 1970-01-01
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多