尽管模型未更改,但请更新视图

时间:2013-11-06 10:26:41

标签: model-view-controller robotlegs

我的应用更新视图以响应模型调度的事件。但是如果模型没有改变怎么办,但我仍然需要更新视图。例如,我已关闭并重新打开弹出窗口。要显示的数据没有更改,但必须重新创建弹出介体和视图。我目前的解决方案是强制在mediator的onRegister()方法中进行初始化,如下所示:

// Inside of PopUpMediator.as

[Inject]
public var popUpModel:IPopUpModel;

[Inject]
public var popUpView:PopUpView;

override public function onRegister()
{
    // Force initialization if the model hasn't changed
    popUpView.foo = popUpModel.foo;

    // Event based initialization
    addContextListener(PopUpModelEvent_foo.CHANGE, foo_changeHandler);        
}

将模型注入调解员并不是一个好主意,所以我想知道当模型没有改变时,启动视图的最佳方法是什么?

2 个答案:

答案 0 :(得分:0)

那么,

我认为你有View1,你有弹出按钮。

View2是你的popus。

因此,当单击View1按钮时,您将从main mediator调度一个事件,该事件将转到popupCommand,您可以在其中将弹出窗口添加到contextView,或者将其删除。

你也可以在模型中有一个状态,即popupVisible,当你改变那个属性时,你会调度一个在主调解器中监听并添加或删除弹出窗口的事件。在这种情况下,命令会改变模型属性,而不是直接将弹出窗口添加到contextView。

第三种方法是在视图中手动添加弹出窗口,并且由于robotlegs正在监听舞台,弹出窗口将自动调解。

答案 1 :(得分:0)

我决定添加一个名为PopUpViewInitEvent的活动。弹出窗口关闭时,命令将检查模型是否已更新。如果不是,它将通过调度PopUpViewInitEvent重新初始化视图。该事件将包含初始化视图所需的所有数据。这样我就不必将模型注入我的调解员。

[Inject]
public var popUpView:PopUpView;

override public function onRegister()
{
    // Batch initialization
    addContextListener(PopUpViewInitEvent.INIT, batchInit);

    // Gradual initialization
    addContextListener(PopUpModelEvent_foo.CHANGE, foo_changeHandler);        
    addContextListener(PopUpModelEvent_bar.CHANGE, bar_changeHandler);        
}

protected function batchInit(event:PopUpViewInitEvent)
{
    popUpView.foo = event.foo;
    popUpView.bar = event.bar;
}