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】:

如果对您没有帮助,您不必强迫自己使用syncsync 可以在常见情况下为您节省时间。

正如您在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 服务器的主要内容,如果未能解决你的问题,请参考以下文章

保存整个集合的最佳实践?

Backbone.js 将模型添加到集合问题

更新模型但保留整个Backbone集合

提取后新保存的 Backbone 模型未出现在集合中

如何从localStorage集合中删除Backbone模型

RestKit 映射错误“无法将对象集合映射到非可变集合。”