2012-09-21 53 views
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”事件。我尝试过“创建”而不是“添加”(不起作用)。

调用创建()始终只是加载URL: “/ API /组/ get_all”

帮助?打开围绕这些东西的最佳实践的任何想法。谢谢!

+0

你是否覆盖了组模型的创建网址? –

回答

0

我想说,如果你可以让其余的“约定”变成可以更容易阅读,并让Backbone处理你的URL,那么它就是默认的。 (在大多数服务器上切换request.method非常容易)。

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

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

我认为这是我要去的。我想的另一个选择是保持URL非常通用(/ api/group /),并将action(“create”)作为参数传递。无论哪种方式,谢谢你的回复! – Dwight

1

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

+1

有什么方法可以改变调用Collection.create()时被调用的url吗? – Dwight

+0

覆盖'Group.sync'方法。或者对于全局,请覆盖'Backbone.sync'。 – risent

1

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