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);
    }    
});

我从我的模型类(组)中处理了同步功能。我在 methodUrl 中使用键“add”,因为 Backbone 文档说调用 create() 时会触发“add”事件。我也尝试过“创建”而不是“添加”(不起作用)。

调用 create() 总是只加载 url: "/api/groups/get_all"

帮助?也对围绕这些东西的最佳实践的任何想法持开放态度。谢谢!

4

3 回答 3

1

阅读backbone.js源码,你会发现:Collection.sync仅由 Collection.fetch. 所以你的覆盖不起作用。Model.sync您应该在Group模型中覆盖 。

于 2012-09-21T06:20:16.897 回答
1

我强烈建议您坚持原来的覆盖方法Backbone.sync。听起来你没有工作的原因是因为你在集合和模型中设置了一次 url。您只需要 - 并且应该 - 在模型或集合设置 url 。如果这不是它不起作用的原因,那么它肯定不起作用,因为调用了主干的“添加”方法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 动词路由请求。例如,如果您正在POSTing,您的服务器应该路由到一个方法,该方法接受传入的参数并从中创建一个新对象。这将允许您在 Backbone 集合上设置一个通用/api/groups/url,无论您是在创建、读取、更新还是销毁。

于 2012-09-22T08:00:46.020 回答
0

我想说,如果您可以遵循其余的“约定”并让 Backbone 使用默认值处理您的 URL,它可能会更容易阅读。(在大多数服务器中打开 request.method 非常容易)。

无论如何,您可以在创建时简单地更改 URL:

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