2013-04-22 78 views
1

我允許用戶按下保存按鈕,因此在該按鈕的事件方法中,我需要保存集合中的所有現有模型,並銷燬在按鈕被按下之前刪除的所有模型。Backbone.js - 當我循環並保存模型時,如何顯示保存gif?

我想要做的就是在這一切都發生的時候顯示一個ajax gif。我怎樣才能知道何時完成了所有model.save()和model.destroy()方法?

這裏是我調用該方法時,保存按鈕被按下:

Save: function() { 
       var response = confirm("Are you sure you want to save?"); 

       if (response == true) { 
        // save items 
        var self = this; 
        this.collection.each(function(item) { 
         self.RemoveTempId(item); // if temp id exists remove it 
         item.save(); 
        }); 
        // destroy items in the trashcan 
        for (var i = this.trashCan.length - 1; i >= 0; i--) { 
         this.trashCan[i].destroy(); 
        } 
       } 
      }, 

我怎樣才能挖掘到一個事件時,他們都完成了,所以我可以隱藏我的AJAX GIF? 謝謝..

回答

0

當用戶同意保存提示後,只需在頁面上顯示您的GIF圖像,並設置其位置,你想要顯示它。可能你應該在屏幕中心顯示它。

將保存方法中的成功和錯誤處理程序作爲選項散列並隱藏您的GIF圖像。

看看Backbone Model save documentation

一些僞代碼是這樣的: -

saveModel: function() { 
    //Show image now. Use CSS to make it visible. 
    $('#gifSelector').show(); 

    model.save({ 'x':1, 'y':2}, // The default attributes in your model which we wanna save 
    success: function() { 
     alert('Model has been saved'); 
     //Hide Gid image 
     $('#gifSelector').hide(); 
    }, 
    error: function(e) { 
     alert('Encountered some problem in saving model'); 
     // Hide GIF image 
     $('#gifSelector').hide(); 
    } 
} 

一個建議:由於您將呼籲每個模型這種方法,每次我們不希望查詢DOM以使用其選擇器獲取GIF圖像。最好存儲一個全局引用並使用該引用來顯示/隱藏它。它會更快;)

+0

這是怎麼回事,當你有,說幹就幹,被保存11種型號的? – 2013-04-22 17:12:16

+0

是的,我的問題是我只想顯示一次ajax gif,並在所有模型被保存或銷燬時隱藏它。 – Smith 2013-04-22 18:07:09

+0

每當每個模型被保存/銷燬時,您的GIF圖像將針對每個模型顯示/隱藏。由於您已經運行了一個循環來保存/銷燬所有模型,因此用戶無法知道您是爲每個模型顯示和隱藏GIF還是爲整個收集完成。試試吧,我認爲它會起作用。 – sachinjain024 2013-04-23 03:35:49

1

這些方法中的每一個(savedestroy)都會返回一個承諾。您可以等待多個承諾,以完成使用jQuery when方法。例如:

$.when(model.save(), model2.destroy()).then(function() { /* do stuff */ }); 

當然,這應該適合您的使用情況下(因爲你遍歷每個模型,所以你可能會使用數組和.apply()的推遲對when數組),但你的主理念。

另外我建議分開confirm對話框和加載gif模型/集合中的視圖。這將更好地分離關注點和更易於管理的代碼。

與deferreds數組的一個例子:

var defs = []; 
this.collection.each(function(item) { 
    defs.push(item.save()); 
}); 

$.when.apply(null, defs).then(function() { 
    /* everything is saved */ 
}); 
+0

如果驗證失敗,'save'將返回'false',因此您可能不希望將所有請求鏈接在一起。 – WiredPrairie 2013-04-22 17:22:55

+0

@WiredPrairie事實上,你可以將任何值傳遞給'when'。如果它不是承諾,則認爲它已解決,並且結果將在下一個函數中傳遞。 http://api.jquery.com/jQuery。當/ – 2013-04-22 17:28:24

+0

(我想指出它並不總是返回一個jqxhr,並且調用'save'而不查看結果可能會產生意想不到的結果)。 – WiredPrairie 2013-04-22 18:05:32