2

コレクションで create() が呼び出されたときに読み込まれる URL を変更することはできますか? ここに記載されているように、モデルでそれを行っています: Backbone.js Model different url for create and update?

これが私のコレクションコードの例です:

var GroupsCollection = Backbone.Collection.extend({
    model:Group,
    url:"/api/groups/get_all/",
    parse:function(res){                    
        return res.groups;
    },

    sync: function(method, model, options) {
        var methodUrl = {
            'add': '/api/group/create/'
        };
        if (methodUrl && methodUrl[method.toLowerCase()]) {
            options = options || {};
            options.url = methodUrl[method.toLowerCase()];
        }
        Backbone.sync(method, model, options);
    }    
});

モデルクラス(グループ)から同期機能に対応しました。バックボーンのドキュメントには、create() が呼び出されたときに「追加」イベントがトリガーされると記載されているため、methodUrl でキー「add」を使用しています。「追加」の代わりに「作成」も試しました(機能しません)。

create() を呼び出すと、常に「/api/groups/get_all」という URL が読み込まれます。

ヘルプ?このようなベスト プラクティスについてのアイデアも歓迎します。ありがとう!

4

3 に答える 3

1

オーバーライドの元のアプローチに固執することを強くお勧めしますBackbone.sync。コレクションで 1 回、モデルで 1 回 URL を設定したため、機能しなかった理由のように思えます。モデルまたはコレクションのいずれかに URL を設定する必要があるだけであり、設定する必要があります。それが機能しなかった理由ではない場合、backbone の 'add' メソッドが呼び出されているため、機能していないことは間違いありません。ソースから:create

var methodMap = {
  'create': 'POST',
  'update': 'PUT',
  'delete': 'DELETE',
  'read':   'GET'
};

同期オーバーライドのいくつかの簡素化:

sync: function(method, model, options) {
    options || (options = {});

    if (method === 'create') {
        options.url = '/api/group/create/';
    }

    Backbone.sync(method, model, options);
}  

ただし、上記のいずれも実際に問題の原因に対処するものではありません。サーバーは HTTP 動詞に基づいてリクエストをルーティングする必要があります。たとえばPOST、サーバーは、着信パラメーターを受け取り、それらから新しいオブジェクトを作成するメソッドにルーティングする必要があります。/api/groups/これにより、作成、読み取り、更新、破棄のいずれを行っているかに関係なく、バックボーン コレクションに汎用 URL を設定できます。

于 2012-09-22T08:00:46.020 に答える
1

ソースを読むと、次のbackbone.jsことがわかります:Collection.syncは によってのみ呼び出され Collection.fetchます。したがって、オーバーライドは機能しません。モデルでオーバーライドする必要が Model.syncあります。Group

于 2012-09-21T06:20:16.897 に答える
0

I'd say it might be easier to read if you could folow the rest "convention" and let Backbone handle your URL with it's default. (It's pretty easy to switch on request.method in most servers).

Anyway, you could simply change the URL at creation time :

 groupCollection.create(
   {attr1: 'val1', etc: '...'}, 
   {url: '/api/group/create/'}
 ).save()
于 2012-09-21T14:08:34.833 に答える