Backbone.js为创建和更新建模不同的url?

pan*_*sru 31 rest backbone.js

假设我有一个Backbone模型,我创建一个这样的模型实例:

var User = Backbone.Model.extend({ ... });
var John = new User({ name : 'John', age : 33 });
Run Code Online (Sandbox Code Playgroud)

我想知道当我用第二次使用John.save()目标(更新/ PUT)时我是否可以使用目标,当我用于目标时以及当我用于目标时/user/createJohn.save()/user/updateJohn.fetch()/user/getJohn.remove()/user/remove

我知道我可以John.url在触发任何方法之前每次定义,但我想知道是否可以自动发生一些如何不覆盖任何Backbone方法.

我知道我可以使用一个url /user/handle并根据请求方法处理请求(GET/POST/PUT/DELETE),但我只是想知道是否有办法在Backbone中为每个动作设置不同的url.

谢谢!

kub*_*etz 78

方法.fetch(),.save()以及.destroy()Backbone.Model被检查,如果该模型已经.sync()确定,如果是的,它会被调用,否则Backbone.sync()将被调用(见链接的源代码的最后几行).

因此,其中一个解决方案是实现.sync()方法.

例:

var User = Backbone.Model.extend({

  // ...

  methodToURL: {
    'read': '/user/get',
    'create': '/user/create',
    'update': '/user/update',
    'delete': '/user/remove'
  },

  sync: function(method, model, options) {
    options = options || {};
    options.url = model.methodToURL[method.toLowerCase()];

    return Backbone.sync.apply(this, arguments);
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 好的解决方案 而不是`options = options || {};`,你应该使用`options || (options = {});`以避免不必要的重新分配. (13认同)
  • @dzejkej,确保从同步返回结果值(否则这会破坏延迟调用模式)sync:function(方法,模型,选项){options = options || {}; options.url = model.methodToURL [method.toLowerCase()]; 返回Backbone.sync(方法,模型,选项); } (6认同)
  • @BrianNickel我同意你的代码更优化,但我有点保留将它包含在答案中,因为JSLint/JSHint工具将它标记为一个问题,在我看来它有点难以阅读...但我给了你+1因为它会引起注意:). (2认同)