骨干覆盖网址集合创建

时间:2012-09-21 05:39:30

标签: backbone.js

是否可以更改在集合上调用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”

帮助?对这些东西的最佳实践也持开放态度。谢谢!

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

我强烈建议您坚持使用覆盖Backbone.sync的原始方法。这听起来像你没有工作的原因是因为你已经在集合中设置了一次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,你的服务器应该路由到一个方法,该方法接收传入的参数并从中创建一个新对象。这将允许您在Backbone集合上设置通用/api/groups/网址,无论您是创建,阅读,更新还是销毁。

答案 2 :(得分:0)

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

无论如何,您只需在创建时更改网址:

 groupCollection.create(
   {attr1: 'val1', etc: '...'}, 
   {url: '/api/group/create/'}
 ).save()