0

可以说,我有一个简单的应用程序,它是用 Backbone.Marionette 创建的。为简单起见,假设我有某个模型的“显示”视图(在这里无关紧要),我可以在其中单击“添加新”,这会在“模态”中显示“新”视图窗户。

我在那里显示简单的表单,它(在验证后)被发送到我的 API。在此期间,我正在显示其他视图(显示诸如“正在保存,请稍候……”之类的内容)。

如果成功,我将关闭此模式窗口,一切正常。

但是(这是棘手的部分):我想处理由于某种原因模型未保存(API 临时停机、连接问题、竞争条件等)的情况,并在另一次显示相同的视图(我认为它应该很容易) - 但是,当我这样做时,不再处理事件(即: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 版本:

如何以仍然可以处理我的事件的方式将视图重新附加到区域?

4

1 回答 1

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)
于 2013-08-25T03:59:50.107 回答