javascript - 在 Backbone.sync 中为另一台服务器上的 API 添加绝对 URL 路径

标签 javascript backbone.js coffeescript

我的 Backbone 应用程序与另一台服务器上存在的 API 进行通信。 Backbone.sync 将默认生成相对 URL。添加绝对服务器路径的最简单方法如下所示:

MyApp.BASE_URL = "https://api.someOtherSite.com"


class MyApp.Model extends Backbone.Model
  urlRoot: "#{MyApp.BASE_URL}/my_app_url"

但是,我宁愿不这样做,因为它不是 DRY。我想我可以通过重写 Backbone.sync 来尝试类似下面的操作:

do (Backbone) ->
  BASE_URL = 'https://api.someOtherSite.com'
  baseSync = Backbone.sync

  Backbone.sync = (method, model, options) ->
    url = _.result(model, 'url')
    options.url = "#{BASE_URL}/#{url}" if url && !options.url

    baseSync method, model, options

但是,这对于代码的其他部分来说是有问题的,因为 options 对象会到处传递。 *(底部有兴趣的解释)

是否有推荐的干净和干燥的方法来将服务器路径添加到 Backbone.sync 生成的所有 URL 的前面?


*如果正在同步的modelBackbone.Collection 的实例,则此options 对象将传递给集合的模型构造函数。如果 URL 作为 options 对象的一部分传入,它是少数几个直接附加到模型的属性之一。这会破坏在集合中创建的任何模型的 sync,因为它们现在附加了一个设置的 URL,而不是使用 生成适当 url 的 url 方法>urlRoot 或集合的 url

最佳答案

我认为最好的选择是创建一个您的其他模型将从中扩展的基础模型:

MyApp.Model = Backbone.Model.extend({
  urlRoot: function(){
             return 'https://api.someOtherSite.com/' + this.get('urlFragment')
  }
});

然后像这样定义你的模型

MyApp.MyModel = MyApp.Model.extend({
  urlFragment: "my_model_url"
})

所以,在 CoffeeScript 中:

class MyApp.Model extends Backbone.Model
  urlRoot: ->
           'https://api.someOtherSite.com/' + @get('urlFragment')

class MyApp.MyModel extends MyApp.Model
  urlFragment: "my_model_url"

现在您已经以 DRY 方式指定了您的 url!

关于javascript - 在 Backbone.sync 中为另一台服务器上的 API 添加绝对 URL 路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16553026/

相关文章:

javascript - jquery 自动完成使用多个来源(本地 json api 和 jsonp)

javascript - 当我们设置更新的对象时如何在 Backbone 模型上触​​发更改事件

javascript - backbone.js 应该如何处理没有返回结果的 GET 请求?

javascript - 在 CoffeeScript 中链接 jquery 方法和参数

javascript - 在 Bootstrap 中通过悬停显示附加部分

javascript - 下拉验证,焦点方法不起作用

javascript - 拼接删除最后一个元素

javascript - Backbone.js 主从 View 、导航问题(包括 jsfiddle)

coffeescript - CoffeeScript 中的两个对象参数

coffeescript - 在CoffeeScript中获取类类型