2015-03-02 32 views
0

我想知道是否有一個通用的模式來保存(POST)或更新(PUT)模型取決於該模型的實例是否已經存在。我發現自己做這樣的事情在我的代碼Backbone.js:創建或更新模式,發佈保存模式

var UserProfileModel = Backbone.Model.extend({ 
    urlRoot: '/api/v1/userprofile' 
}); 

function upsave(){ 
    var userprofile = new UserProfileModel({ 
     user: self.user_id, 
     user_type: self.user_type, 
     userprofile_complete: true 
    }); 

    userprofile.fetch({ 
     success: function(model, response, options) { 
      //model exists and is now populated 
      userprofile.set('user_type', self.user_type); 
      userprofile.set('userprofile_complete', true); 
      userprofile.save(); 
     }, 

     error: function(model, xhr, options) { 
      if(xhr.status === 404) { 
       //model was not found 
       userprofile.save(); 
      } 
      else { 
       alert('The server encountered an error saving the user profiile'); 
       console.log(xhr.status); 
      } 
     } 
    }); 
}; 

我從地方的模型屬性,創建一個新的模型,取模型,如果存在使用設置屬性,如果返回404,保存。這是一個可接受的設計模式?我是新手,想知道這是否是正確的處理方法。

而且,在成功保存事件後,將用戶發送到下一個uri的正確方法是什麼?我知道你可以這樣做:document.location.href = '/some/relative/url/',這是有效的,但我來自django背景,在視圖中處理重定向,我不是將URL硬編碼到模板中。我想不回去這樣做。

+0

Backbone(同步)會自動爲您執行此操作,具體取決於模型是否已具有「id」屬性,因此在服務器上是否存在。所以,只需調用'model.save()' - 它會發佈一個新模型並放入一個現有模型。保存時不要原封不動地從服務器返回整個模型。 – Exinferis 2015-03-02 14:41:59

+0

這就是我最初的想法,但沒有第一次獲取save()函數會自動生成一個沒有'id'的POST。服務器端的原因和錯誤500。 – ghiotion 2015-03-02 14:54:39

回答

1

Backbone檢查模型是否定義了一個id,當使用RESTful後端時,它自然應該與資源的後端id相對應。
如果模型上的id字段已設置,則save將執行PUT請求,否則將生成POST請求。

通常,客戶端在執行PUT請求之前知道該ID,因爲它意在更新現有資源。
骨幹並不在乎你如何放置身份證。您可以按照指示使用GET請求,也可以根據上下文從DOM獲取ID。如果它是當前登錄的用戶的用戶標識,則還可以將其臨時存儲在localstorage/cookie/global變量中,並在用戶註銷時將其刪除。這樣你可以避免額外的http請求。

重定向最好通過錨href的立即完成,但如果一些邏輯必須先執行,我也使用location.href,因爲這似乎是執行客戶端重定向的最佳方式。