8

backbone.jsでは、すべてのモデルのrooturlを手動で設定する必要があります。これを1つの場所に一度設定すれば、すべてのモデルで使用できる方法はありますか?

たとえば。api.site.comはRESTサービスになりますが、テストの目的でlocalhost:1000、サービスのルートURLを簡単に変更でき、アプリケーションに存在する多くのモデルのいたるところにそれらを持たないようにする必要があるかもしれません。

4

7 に答える 7

13

私は、AMD(require.js)でBackboneを使用するときに、これを行うための最も洗練された方法で遊んでいます。これは私が思いついたものであり、[これまでのところ]最高のようです。

まず、ここで説明するように、でデータをブートストラップします。

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>

次に、次のようにバックボーンモデルの基本クラスを定義します。

js / models / Base.js(このモジュール名は上記の構成のモジュール名と一致することに注意してください)

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

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

  }
);

最後に、次のように、そのベースからすべてのバックボーンモデルを拡張します。

js / models / User.js

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

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

  }
);

これは、BackboneとRequire.JSに関して私が以前に持っていた質問と正直に関連しています。

関連資料:http://requirejs.org/docs/api.html#config-moduleconfig

于 2013-03-20T16:05:52.827 に答える
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',
...
});

ただし、これには注意してください。コミットするときに、あるURLから別のURLに切り替えるのを忘れる可能性があります。適用される場合は、相対パスを処理することをお勧めします。

于 2012-11-14T11:19:37.413 に答える
2

私の意見では、これを達成するための最良の方法は、Backbone.syncメソッドをオーバーライドし、そこにルートURLを追加することです。これは、APIドメインを知ることはモデルの責任ではないためです。

// Cache Backbone.sync for later use
var sync = Backbone.sync;
Backbone.sync = function(method, model, options){
  options.beforeSend = function(){
    this.url = API_ROOT_URL + this.url;
  };
  return sync.call(this, method, model, options);
};

そして、通常どおりにモデルを作成できます。

var Resource = Backbone.Model.extend({
  urlRoot: '/resources',
});

これと同じ方法を使用して.json、すべてのURLに拡張子を追加し、ブラウザーのキャッシュを介したJSONのフラッシュを防ぎます。

于 2015-05-22T11:39:37.543 に答える
2

https://coderwall.com/p/8ldaqw/add-a-root-url-to-all-backbone-api-requestから適応

var backboneSync = Backbone.sync;

Backbone.sync = function (method, model, options) {
    /*
     * Change the `url` property of options to begin
     * with the URL from settings
     * This works because the options object gets sent as
     * the jQuery ajax options, which includes the `url` property
     */
    options = _.extend(options, {
        url: API_ROOT + _.result(model, 'url')
    });

    /*
     *  Call the stored original Backbone.sync
     * method with the new url property
     */
    backboneSync(method, model, options);
};
于 2016-01-26T21:18:16.253 に答える
1

urlRootすべてのモデルを手動で設定することの正確な意味がわかりません。おそらくあなたはそうします

var MyModel = Backbone.Model.extend({

  urlRoot: '/mymodel',
  ...

});

右?その場合、各モデルインスタンスは当然同じです。urlRootたとえば、他のモデルインスタンスは、MyOtherModelいくつか異なるものになりurlRootます。

何らかの理由で同じものを使用する必要がある場合はurlRoot、モデルが属性を共有しているためだと思います。これは、次のことができるように、継承または拡張を示唆する必要があります。

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

var MyModel = BaseModel.extend({
  ...
});
于 2012-04-28T21:42:28.843 に答える
0

'/'からURLを開始するだけです。したがって、ローカルホストまたは実際のドメインに依存することはありません。

于 2014-05-05T21:08:05.187 に答える
0

これは本当に古い投稿ですが、私のバージョンは誰かに役立つと思います。私はrequire.jsでバックボーンを使用し、サーバー側とクライアント側は完全に分離されています。requirejsスクリプトを宣言するときに、同時にAPIrootがどこにあるかをクライアントアプリに知らせます。

<script 
     data-main="js/main" 
     data-api-url="https://api/v1/" 
     src="js/require.js">
</script>

次に、バックボーンモジュールに入ります。

var $scriptEl = $('script[data-main]'),
      base = $scriptEl.attr('data-api-url');

var BaseModel = Backbone.Model.extend({
    urlRoot: base
});

var model = BaseModel.extend({});

これは私が見つけることができた最もエレガントな方法です。

于 2016-12-08T16:17:38.583 に答える