UI5路由器销毁缓存的视图

sapui5

1191 观看

2回复

825 作者的声誉

我有一个Master Details Page App,我们在其中配置了Router以在页面之间导航。

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": {}
                   ...

该应用程序是简单的Employee CRUD应用程序,我已为路由器配置了2条路由,其中​​1条用于创建/编辑,另一条用于Dispaly

如果我从一个视图导航到另一个视图,则需要销毁该视图,例如在页面开始时显示包含所有雇员的母版页,而详细页面显示employee1的显示视图。

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

如何做到这一点?还是我需要采取不同的方式来解决缓存?否则我不应该想到记忆

尝试调用SplitApp的destroy onDetailNavigate

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

这使Error下次再次返回同一视图

Error: The object with ID __xmlview4 was destroyed and cannot be used anymore.
作者: chiranjeevigk 的来源 发布者: 2017 年 9 月 15 日

回应 2


1

3852 作者的声誉

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

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

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

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

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

作者: matbtt 发布者: 2017 年 9 月 15 日

0

825 作者的声誉

决定

由于我的问题是关于从路由器中删除缓存的视图,因此我遵循了@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的答案。

谢谢你们两个宝贵的意见。

作者: chiranjeevigk 发布者: 2017 年 9 月 19 日
32x32