当前位置:  开发笔记 > 前端 > 正文

是否可以在一个视图中使用2个模型

如何解决《是否可以在一个视图中使用2个模型》经验,为你挑选了1个好方法。

我坚持认为SAPUI5中是否可以使用概念,并且由于文档在这个详细程度上可能有点难以处理,我在研究路径中提出的问题比正常情况要早.主要是我不想花太多时间,如果有一个立即'否'的答案.

我有一个使用JSON模型的主视图的用例,但我必须生成自己的控件 - 我不能使用SplitApp等.

该模型实际上是一个2层深的树,主要导致细节.从概念上讲是这样的:

{ 
    "master": [
        {
            "name": "Master 1",
            "detail" : [
                {
                "name": "Detail 1-1"
                },
                {
                "name": "Detail 1-2"
                }
            ]
        },
        {
            "name": "Master 2",
            "detail" : [
                {
                "name": "Detail 2-1"
                },
                {
                "name": "Detail 2-2"
                }
            ]
        }
    ]
}   

UX是一个可选择的主列表,当进行选择时,将刷新详细列表控件以显示所选主节点的子节点的详细信息.

我熟悉将模型绑定到视图

sap.ui.getCore().setModel(oModel) 
this.getView().setModel(oModel)

但是根据我迄今为止的学习情况,这会将视图中的所有控件绑定到一个模型.

我认为可能值得追求的选择是:

    将单独的模型绑定到每个主控制和详细控制,并编写自定义代码以在选择主控时切换详细模型.但是如何制作这样的绑定;

    使用单个模型,但以某种方式设置细节控件以识别"当前选定的"主控.

    在细节控制上使用某种过滤器.

进一步解释2,如果说我正在使用表格进行详细显示,我可能会在表格def中使用

   

所以我希望修改类似的路径

path: '/master[n]/detail/'

其中n表示选定的主实例.

是可能的,还是有另一种选择,或者我应该放弃.

编辑:我在这里发现了Michael Herzog这种基于过滤器的潜在解决方案.他的描述是:

我将举例说明如何在SAPUI5中实现matser-detail关系.

使用案例:当用户点击第一个表中的客户端时,所有相关订单都应显示在第二个表中.应隐藏其他客户的订单.

因此,在我们看来,我们有两个表:

    表:客户

    表:订单

创建两个表并设置数据绑定后,在第一个表上实现此事件处理程序:

oTableClients.attachRowSelectionChange( function(oEvent){

    // first, we fetch the binding context of the selected row
     var selectedRowContext = oEvent.getParameter("rowContext");
     // get the ID of the customer via rowContext. The model-object represents the data of the first table
     var selectedClientId = oModel,getProperty("id", selectedRowContext);
     // get binding of second table
     var ordersBinding = oTableOrders.getBinding();
     //create new filter to show the relevant data for the selected customer
     var oFilter = new sap.ui.model.Filter("clientId", sap.ui.model.FilterOperation.EQ, selectedClientId);
     // apply filter to binding
     ordersBinding.filter([oFilter]);
});

我可以看到这种方法对我来说是可行的 - 有什么理由说明这种模式存在根本缺陷吗?



1> matbtt..:

一般来说,您的视图可以包含您喜欢的模型.唯一的限制是只能有一个无名模型,即所有其他模型都需要命名.以下代码显示了差异:

this.getView().setModel(new JSONModel(data));
this.getView().setModel(new JSONModel(data), name));

要绑定命名模型,必须在绑定指令中提供其名称,否则运行时使用无名模型.以下示例显示了差异(请注意,除非您要提供其他参数,否则可以使用短绑定语法,即您可以省略该path属性:

在您的示例中,我建议使用一个模型并使用绑定上下文来控制详细信息表中显示的数据.

详细信息表的绑定应该是相对的,如下所示:

处理主列表选择的处理程序如下:

onMasterItemSelect : function(event) {
    // get the binding context of the currently selected master item, e.g. /master/0
    var masterBindingContext = event.getParameter("listItem").getBindingContext();

    // bind detail table to the selected master item using bindElement
    this.byId("details").bindElement(masterBindingContext.getPath());
}

推荐阅读
李桂平2402851397
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有