Backbone:将整个集合保存到非 RESTful 服务器
Posted
技术标签:
【中文标题】Backbone:将整个集合保存到非 RESTful 服务器【英文标题】:Backbone: Saving an entire collection to non-RESTful server 【发布时间】:2016-01-13 03:01:11 【问题描述】:我一直在查看有关如何使用非 RESTful 服务器保存 Backbone 集合的多篇文章,但我仍然有点困惑。我创建了一个集合,其中我覆盖了 toJSON
方法来自定义我的数据以发布到我的 API("/api/entity/735/request/personDelete"
目前已换成 jsfiddles /echo/json)。所以我创建了一个save
方法,它使用Backbone.sync
,在success
上我正在注销任何类型的响应并且对象是空的,不确定在哪里丢失或我做错了什么;谁能给我一些指导?只是想让这个例子正常工作,这样我就可以继续使用这样的东西。
JS
var PersonCollection = Backbone.Collection.extend(
model: PersonModel,
url: function()
// Dummy JSFiddle endpoint
// Example non-RESTful url "/api/entity/735/request/personDelete"
return '/echo/json/';
,
/**
* Override toJSON to loop through collection models making
* custom objects containing specific attributes to be posted.
*/
toJSON: function()
console.log(this.models);
var plucked = this.models.map(function(model)
return _.pick( model.toJSON(), ["id","name", "teams"] )
);
console.log(plucked);
return plucked;
,
save: function(options)
Backbone.sync('create', this,
success: function(data, textStatus, jqXHR)
console.log('Saved!', data);
);
);
JSFiddle: http://jsfiddle.net/kyllle/f1h4cz7f/3/
【问题讨论】:
请检查是否发出了请求,参数是否按预期传递(我对此表示怀疑)并且您会收到 2xx 响应。请编辑您的帖子并指定请求的外观(例如,表单编码或应用程序/json 等)。我会说事件Backbone.sync()
可能不适合您的需求。您可能希望直接在save()
中使用$.ajax()
,或者,如果您有更多与“非标准”REST API 通信的模型和集合,您可能希望覆盖Backbone.sync()
。
这是我现在的问题的一部分,我不确定我需要在哪里或如何传递参数以便可以有效地运行保存?
您真的要保存集合中的所有内容吗?我知道您说您的后端不是 RESTful,但是您的后端期望的是什么?以及它如何期待 json?
styler,请注意:您还没有回应 Javier 和我的详细信息请求(即使您不确定要做什么和如何做,但至少应该确定您的要求是什么)。 Yura 的回答是否回答了您的问题/是否有帮助?
对不起,我花了一段时间才回复,我认为我现在的问题是我在保存响应中没有看到我在 toJSON 中修改的更新数据。我单击发布数据,然后我看到 toJSON 仅使用 id 名称和团队进行了正确的更新,然后保存火灾但成功仅显示一个空白对象,只是想知道这些如何正确连接?
【参考方案1】:
如果对您没有帮助,您不必强迫自己使用sync
。 sync
可以在常见情况下为您节省时间。
正如您在annotated sync
code 中看到的那样,它最终只调用jQuery.ajax 并包含有助于RESTful 后端的逻辑。
它还会触发一些事件,您可能会或可能不会在应用程序的其他部分监听这些事件,例如request
(发出请求时)和sync
(成功完成请求时),或@987654330 @(如果请求失败)
如果重新发明 sync
并不令人兴奋,那么您可以在您的应用中完成所有这些操作。
准备您的数据,调用$.ajax
将数据发送到您的后端,如果您要收听它们,还可以选择trigger
主干事件。
【讨论】:
是的,我完全理解你从哪里来,但我认为我可以结合 toJSON 和 sync 以更好的方式做到这一点【参考方案2】:您可以将您的集合包装在主干模型中。
var CollectionWrapper = Backbone.Model.extend(
url: "/echo/json"
);
然后您可以使用 model.save() 和/或 Backbone.sync(),因为 Backbone 打算使用它。
看到这个答案:"How" to save an entire collection in Backbone.js - Backbone.sync or jQuery.ajax?
【讨论】:
这是一条评论。除此之外,OP 询问如何处理不遵循 Backbone 原则的 (REST) API。他说"a non-RESTful server"
和"/api/entity/735/request/personDelete"
看起来更像是动词(动作)是由 URL 组件反映的,而不是由 HTTP 动词反映的。我猜 OP 已经意识到他/她必须覆盖 save()
或 sync()
但不知道该怎么做。以上是关于Backbone:将整个集合保存到非 RESTful 服务器的主要内容,如果未能解决你的问题,请参考以下文章