2013-08-21 69 views
0

可以說,我有簡單的應用程序,它是用Backbone.Marionette創建的。 爲了簡單起見,假設我已經有了某個模型的「顯示」視圖(這裏沒有關係),在那裏我可以點擊「添加新的」,在「模式」中顯示「新」視圖「窗口。重新附加Marionette.View和事件處理

我顯示那裏簡單的形式,(驗證後)發送到我的API。在此期間,我正在顯示其他視圖(顯示諸如「正在保存,請稍候...」等)。

如果成功,我將關閉此模式窗口,並且一切正常。

但是(這是棘手的部分):我想處理情況,當從某種原因模型沒有保存(API臨時停機,連接問題,競爭條件等),並顯示相同的視圖(I認爲它應該很容易) - 但是,當我這樣做時,事件不再被處理(即:submitForm行動不執行第二次:()

這是我的我的證明這個概念:

class MyApp.SampleView extends Marionette.View 
    events: 
    "submit form": "submitForm" 

    submitForm: (event) -> 
    event.preventDefault() 

    data = $(event.currentTarget).serializeObject() 

    model = SampleModel.new(data) 

    if model.isValid() 
     MyApp.popupRegion.show(SavingPopup) 
     savePromise = model.save() 

     savePromise.success => 
     @close() 
     @displayNotification("Model has been added") 
     savePromise.error => 
     @displayNotification("Something went wrong, please try again") 
     MyApp.popupRegion.show(this) # displays correct view 
             # but does not handle events :(

TL; DR版本:

如何以這樣的方式將視圖重新附加到區域,以便我的事件仍將被處理?

回答

1

在區域show()的視圖之前,它在當前顯示的視圖上調用close()close()充當視圖的析構函數,解除所有事件的綁定,使其無效並允許垃圾收集器處理它。

當您執行MyApp.popupRegion.show(SavingPopup)時,thisclose()'d。您需要在savePromise.error中創建視圖的新實例,或者找到一些其他方式嚮應用程序發出視圖需要重新創建的信號。

像這樣的東西應該工作:

savePromise.error => 
    @displayNotification("Something went wrong, please try again") 
    MyApp.popupRegion.show(new MyApp.SampleView)