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

时间:2017-01-19 23:49:11

标签: sapui5

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

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

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

#!/bin/sh

for fil in $(git diff --name-only --staged | grep ".js"); do
 esformatter -i$ fil & git add $fil;
done

git commit -m "Adding format to files"

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

我熟悉通过

将模型绑定到视图
{ 
    "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"
                }
            ]
        }
    ]
}   

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

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

  1. 将单独的模型绑定到每个主控制和详细控制,并编写自定义代码以在选择主控时切换详细模型。但是如何制作这样的绑定;
  2. 使用单个模型但以某种方式设置细节控件以识别“当前选定的”主控。
  3. 在细节控件上使用某种过滤器。
  4. 进一步解释2,如果说我正在使用表格进行详细显示,我可能会在表格中使用def

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

    所以我希望修改类似

    的路径
       <Table
                id="detailList"
                items="{
                    path: '/'
                }",
                ...
         >
    

    其中n表示所选的主实例。

    是可能的,还是有其他选择,或者我应该放弃。

    编辑:我在constructor找到了这个基于过滤器的潜在解决方案。他的描述是:

      

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

         

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

         

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

         
        
    1. 表:客户

    2.   
    3. 表:订单

    4.         

      创建两个表并设置数据绑定后,执行   第一个表上的这个事件处理程序:

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

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

1 个答案:

答案 0 :(得分:8)

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

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

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

<Table items="{/path}">
<Table items="{name>/path}">

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

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

<Table id="detailList" items="{detail}">

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

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());
}