4

我的 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对象会到处传递。*(有兴趣者在下方说明)

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


*如果model正在同步的是Backbone.Collection这个options对象的一个​​实例,将被传递给集合的模型构造函数。如果 URL 作为对象的一部分传入,则 URL 是直接附加到模型的少数属性之一options。这对于在集合中创建的任何模型都会中断sync,因为它们现在附加了一个设置的 URL,而不是url通过使用urlRoot或集合的url.

4

3 回答 3

4

我认为最好的选择是创建一个基本模型,您的其他模型将从:

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 方式指定了您的网址!

于 2013-05-16T11:32:50.057 回答
1

您应该使用原型在所有集合或模型等中具有通用属性。

Backbone.Collection.prototype.absURL  = 'http://example.com';

var MyCollection = Backbone.Collection.extend({
model : myModel, 
url: function() {
    return this.absURL + '/api/stuff';
}
});
于 2013-09-13T16:33:49.537 回答
1

知道这是旧的,但我在为我正在开发的 api 组装一个客户端时遇到了这个问题。我的解决方案虽然枯燥且非常简单,但发生在 jQuery 而不是 Backbone 中。这就是说 jQuery 是 Backbone 的一个部门,所以我认为它对于典型案例来说是一种合理的方法。

$.ajaxPrefilter(function prependUrlPrefilter(opts) {
  opts.url = 'http://127.0.0.1:3000' + opts.url;
});

这种方法的一个问题是它会全局改变通过 jQuery 运行的任何 xhr 调用的 url。如果您在多个域上调用 Web 服务,或者您有可以共享相同 jQuery 的插件,您需要在此处添加一个条件。

此外,您还需要将域的主机部分抽象为配置。

更多可以在这里找到关于 ajaxPrefilters 的信息。

于 2015-12-20T19:07:48.917 回答