2015-10-14 38 views
11

我一直在關注如何使用非RESTful服務器保存Backbone集合的多篇文章,我仍然有點困惑。我創建了一個集合,我重寫了toJSON方法來自定義我的數據以發佈到我的API("/api/entity/735/request/personDelete"當前換成jsfiddles/echo/json)。所以我創建了一個save方法,它使用Backbone.sync,在success我註銷了任何類型的響應,並且對象是空的,不確定事情會在哪裏丟失或我做錯了什麼;任何人都可以給我一些指導嗎?只是想讓這個例子工作,所以我可以繼續使用這樣的事情。Backbone:將整個集合保存到非RESTful服務器

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/

+0

Plase檢查,如果該請求時,這些參數傳遞的預期(我懷疑),你會得到一個2xx的應答。請編輯您的文章,指定請求的外觀(例如表單編碼或應用程序/ json等)。我會說事件'Backbone.sync()'可能不適合您的需求。你可能希望直接在'save()'中使用'$ .ajax()',或者如果你有更多的模型和集合與那個「非標準」REST API進行通信,你可能想覆蓋'Backbone.sync ()'而不是。 –

+0

這是我現在問題的一部分,我不確定我需要傳遞參數的位置或方式,以便保存可以有效地運行? – styler

+1

你真的想要保存收藏中的所有東西嗎?我知道你說過你的後端不是RESTful,但你的後端期望的是什麼?以及它如何期待json? –

回答

7

你不必強迫自己使用sync,如果它不能幫助你。 sync是爲了節省您在常見場景中的時間。

正如您在annotated sync code中看到的那樣,它最終只會調用jQuery.ajax幷包含用於幫助RESTful後端的邏輯。

而且它會觸發一些事件,您可能會或可能不會在你的應用程序的其他部分聽,像request(當提出請求)和sync(當成功完成請求),或error(如果請求失敗)

所有這些你可以從你的應用程序,如果重新創建sync並不令人興奮。

準備好您的數據,請撥打$.ajax將數據發送到您的後端,如果您要收聽它們,可以選擇trigger骨幹事件。

+0

是的,我完全理解你來自哪裏,但我認爲我可以結合使用JSON和同步以更好的方式做到這一點 – styler

0

您可以將您的收藏包裝在骨幹模型中。

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?

+0

這是一條評論。除此之外,OP會詢問如何處理不符合Backbone原則的(REST)API。他說''非RESTful服務器''和''/ api/entity/735/request/personDelete「'看起來更像是動詞(動作)反映的是URL組件,而不是HTTP動詞。我猜OP已經意識到他必須重寫'save()'或'sync()',但不知道該怎麼做。 –