让我们说,我有一个简单的应用程序,它是使用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 :(
如何将视图重新附加到区域,以便仍然可以处理我的事件?
答案 0 :(得分:1)
在区域show()
之前,视图会在当前显示的视图上调用close()
。 close()
充当视图的析构函数,解除所有事件的绑定,使其无用并允许垃圾收集器处理它。
执行MyApp.popupRegion.show(SavingPopup)
时,this
为close()
'd。您需要在savePromise.error
中创建一个新的视图实例,或者找一些其他方式来通知您的应用程序需要重新创建视图。
这样的事情应该有效:
savePromise.error =>
@displayNotification("Something went wrong, please try again")
MyApp.popupRegion.show(new MyApp.SampleView)