UI5路由器销毁缓存的视图

时间:2017-09-15 04:54:07

标签: sapui5

我有一个主详细信息页面应用程序,我们将路由器配置为在页面之间导航。

App.view.xml

<SplitApp id="rootControl" detailNavigate="onDetailNavigation">
</SplitApp>

的manifest.json

"routing": {
                "config": {
                    "routerClass": "sap.m.routing.Router",
                    "viewPath": "master",
                    "controlId": "rootControl",
                    "viewType": "XML",
                    "async":"true"
                },
                "routes": [
                    {
                        ....
                    },
                    ...
                "targets": {}
                   ...

应用程序是简单的员工CRUD应用程序,我已经为路由器配置了2条路由1用于创建/编辑,另一条用于显示

如果我从一个视图导航到另一个视图,我需要销毁视图,就像在页面开始时显示包含所有员工的主页面和详细信息页面显示employee1的显示视图。

我在显示视图上有“编辑”按钮,按下i导航详细信息页面从“显示”视图到“编辑视图”,此时我需要从路由器中删除显示视图,该视图已缓存。

如何实现这一目标?或者我需要采取不同的approch来解决缓存问题?或者我不应该想到记忆

尝试调用split onDetailNavigate of SplitApp

onDetailNavigation : function(oEvent){
            console.log("Split app onDetailNavigation");
            oEvent.getParameter('from').destroy();
        }

下次再次返回同一视图时会出现错误

Error: The object with ID __xmlview4 was destroyed and cannot be used anymore.

2 个答案:

答案 0 :(得分:1)

根据注释,您会销毁视图以保存两个视图分配的内存。我不认为这会带来任何实际好处。有三种可能的解决方案:

  • 坚持使用当前的解决方案。
  • 使用单个视图并在显示和编辑片段之间切换。可以找到一个示例here
  • 使用带有输入字段的表单的单个视图。将editable属性绑定到反映整个表单或每个属性的编辑或显示状态的模型(例如视图模型)属性。

<Input value="{applicationModel>/propertyName}" editable="{applicationModel>/Attributes/propertyName/editable}"/>

我正在使用第三种解决方案的版本。我的应用程序模型(扩展JSONModel)包含应用程序数据以及控制属性的状态。控制器只在应用程序模型上调用setEditable来计算状态。使用这种方法,我避免将逻辑分布到应用程序的许多部分。

{{1}}

答案 1 :(得分:0)

由于我的问题是关于从缓存中销毁路由器的视图,我已经按照@boghyon注释并在我的代码中进行了一些更改,如下所示,在导航详细信息页面后删除页面,如下所示

var splitApp = this.getView().byId('rootControl'); 
splitApp.removeDetailPage(oEvent.getParameter('from')); 

并从路由器中删除缓存视图我写了一些逻辑

var router = this.getOwnerComponent().getRouter(); 
for(var view in router._oViews._oViews){
if( router._oViews._oViews[view].sId === oEvent.getParameter('fromId'){ 
 delete router._oViews._oViews[view]; 
 } 
}

破坏视野。

通过这样做多次加载视图,这不是我的要求的正确方法,我们遵循@matbtt答案。

感谢您提供有价值的输入。