是否可以更改在集合上调用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”
帮助?对这些东西的最佳实践也持开放态度。谢谢!
答案 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()