在Backbone.js应用程序中设置全局REST根URL

Sha*_*ean 7 backbone.js

在backbone.js中,您必须手动设置每个模型的rooturl.有没有办法我们可以在一个位置设置一次,所有型号都会使用它?

例如.api.site.com将是REST服务,但出于测试目的,localhost:1000我可能需要能够轻松地更改服务的根URL,而不是在应用程序中存在的许多模型中将它们全部放在一起.

Bar*_*art 13

在使用Backbone和AMD(require.js)时,我一直在玩最优雅的方法.这就是我想出来的,并且最好[到目前为止].

首先,引导数据,描述在这里.

index.htm(应用程序入口点)

<!DOCTYPE html>
<head>
  <meta charset="utf-8">

  <script>
    var require = {
      config: {
        // key name is module, value is data to give module
        'models/Base': {
          apiUrl: '/some/path/to/api',
        }
      }
    }
  </script>
<script data-main="js/main" src="vendor/require/require-jquery.js"></script>
</head>
<body></body>
</html>
Run Code Online (Sandbox Code Playgroud)

接下来,为Backbone模型定义一个基类,如下所示:

js/models/Base.js(注意这个模块名称与上面配置中的模块名称匹配)

define(['module', 'backbone'],
  function(module, Backbone){

    return Backbone.Model.extend({
      getApiUrl: function(){
        return module.config().apiUrl;
      }
    });

  }
);
Run Code Online (Sandbox Code Playgroud)

最后,从该基础扩展所有Backbone模型,如下所示:

JS /模型/ user.js的

define(['models/Base'],
  function(BaseModel){

    return BaseModel.extend({
      urlRoot: function(){
        return this.getApiUrl() + '/user';
      }
      // ... more cool stuff here
    });

  }
);
Run Code Online (Sandbox Code Playgroud)

这与我之前关于Backbone和Require.JS的问题相关.

相关阅读:http://requirejs.org/docs/api.html#config-moduleconfig


Aug*_*ger 8

我的理解是:

你有几个模型:model1和model2

根URL可以是http://api.site.com或者http://localhost:8080取决于您是在本地还是在外部工作.有一天它可能会http://api.anothersite.com

我会做这样的事情:

// Global var before any other JS code, you comment line depending on which one applies
var ROOT = 'http://api.site.com'
// var ROOT = 'http://localhost:8080'

var Model1 = Backbone.Model.extend({
urlRoot: ROOT+'/model1',
...
});

var Model2 = Backbone.Model.extend({
urlRoot: ROOT+'/model2',
...
});
Run Code Online (Sandbox Code Playgroud)

但是要小心,你可能会在提交时忘记从一个url切换到另一个url.更好的是处理相对路径,如果他们适用.


ggo*_*zad 1

不确定您urlRoot为每个模型手动设置的确切含义。想必你会这样做

var MyModel = Backbone.Model.extend({

  urlRoot: '/mymodel',
  ...

});
Run Code Online (Sandbox Code Playgroud)

正确的?那么每个模型实例自然都有相同的urlRoot。任何其他模型实例MyOtherModel都会有一些不同urlRoot

如果出于某种原因您需要使用相同的urlRoot,我猜这是因为模型共享属性。这应该暗示继承或扩展,这样你就可以这样做:

var BaseModel = Backbone.Model.extend({
  urlRoot: '/mymodel'
});

var MyModel = BaseModel.extend({
  ...
});
Run Code Online (Sandbox Code Playgroud)