重新连接Marionette.View和事件处理

时间:2013-08-21 10:51:03

标签: backbone.js marionette backbone-views backbone-events

让我们说,我有一个简单的应用程序,它是使用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版本:

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

1 个答案:

答案 0 :(得分: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)