2013-03-05 67 views
3

我有一個簡單的應用程序,將數據發送到服務器:Backbone.sync成功函數

this.model.save(null, {success: dataSentOK}); 

,然後從服務器中刪除@數據:

Backbone.sync("delete", data, {success: dataSentOK}); 

這兩種方法有對抗服務器(添加和刪除數據)。

但是,在第二種方法Backbone.sync(...)中,不調用成功回調。

誰能告訴我我做錯了什麼?我已經看過了Backbone.js的源代碼,我已經試過和明確的函數調用:

{success: function(){ 
    console.log("Done"); 
}} 

及各種形式的參數:

{success: function(data, textStatus, jqXHR){ 
    console.log("Done"); 
}} 

並沒有什麼我做調用函數成功。

請幫忙。

感謝 亞當

+0

骨幹哪個版本您使用的?數據是'Backbone.Model'的一個實例嗎?你是否在使用任何插件,例如'Backbone.localStorage'? – jevakallio 2013-03-05 10:32:30

+1

爲什麼使用Backbone.sync「刪除」?爲什麼不調用'data.destroy()'? – neebz 2013-03-05 11:27:41

+0

使用backbone.js版本0.3.3 下劃線1.1.4 jquery 1.4.4 如果我使用destroy()這是否意味着我應該更改模型中的URL以達到刪除服務? – 2013-03-05 11:37:41

回答

0

Backbone.js的,在幕後,使用JQuery.ajax(...)。所以我直接使用JQuery解決了我的Backbone.js通信問題。

骨幹相信他們通過在自己的代碼中包裝一個完美的功能API來增加價值,因爲他們選擇將他們的體系結構緊密地連接到用於CRUD模型對象的模型和傳輸協議之間。

Model對象必須具有URL屬性,這意味着您必須使用該模型的網絡通信的send(), fetch() etc函數。實際上,這意味着如果你希望你的模型只是一個DTO,那麼你就不能使用Backbone.js。這也意味着如果你想直接使用JQuery,那麼你完全可以不使用他們的MVC架構。

將URL附加到模型對象的含義也意味着應該對所有CRUD操作使用相同的URL。這是沒有道理的,特別是如果您使用REST服務。

一個好的架構將被模塊化並遵循the separation of concerns principle。 Backbone.js沒有這樣做是一個遺憾,因爲它是一個有前景的框架,如果它不是如此緊密耦合,並且很難用於最簡單的任務。

+1

這不公平地譴責Backbone.js。您不必使用模型的send(),fetch()等。從Backbone的角度來看,不使用'sync'並直接使用jQuery是完美的。 – 2013-12-13 15:03:38

+0

url可以是一個函數,這意味着如果您想要或根據任何給定條件生成它,則可以在每次獲取調用時更改它。它根本不是「附加」的。 – 2016-01-25 16:24:04

2

更好的方法是通過遵循一個既定的強大JavaScript事件。主幹激發了四個相當重要的事件:sync,error,destroyinvalid

sync在同步操作成功時觸發。 error在同步操作失敗時觸發。 invalid在驗證失敗時觸發(如果您有這個地方)。 destroy在你摧毀模型時被觸發。

因此,我會親自將此事件綁定到您關心的特定模型,如果它們都是它們,則將它綁定到模型定義中。爲了我的目的,綁定到事件的內容基於上下文而改變,所以我在我的觀點中以每個模型爲基礎進行綁定。

例子:

var MyModel = Backbone.Model.extend({ 
    // your model definition. 
}); 

var MyView = Backbone.View.extend({ 
    // your view definition 
    initialize : function() { 
    this.model.on('sync', this.onSync); 
    this.model.on('error', this.onError); 
    this.model.on('destroy', this.onDestroy); 
    }, 
    this.onSync : function(model, errors, options) { 
    // your code 
    }, 
    this.onError : function(model, errors, options) { 
    // your code 
    }, 
    this.onDestroy : function(model, errors, options) { 
    // your code 
    } 
});