在列出子项

时间:2017-01-26 21:57:10

标签: sapui5

我在JSON模型中有父子关系。我有一个视图,列出使用ObjectList的父项。此列表中项目的按下事件导航到另一个视图,其中类似的ObjectList显示所选父项的子项。

我希望能够使显示子项的视图的标题包含父项的属性。例如,如果模型是:

{
    "parents": [
        {
        "name": "Spartacus","children": [{"name": "Spartacus Jnr"}, {"name": "Little Spartacus"}]
        }, 
        {"name": "Rasputin", "children": [{"name": "Grigori"}, {"name": "Yefimovich"}]
        }, 
        {"name": "Sting", "children": [{"name": "Josepth"}, {"name": "Fuchsia"}]}
            ]
}

然后,如果我选择父母'斯巴达克斯'那么显示孩子的视图应该是标题Children of Spartacus

重要:由于各种原因,我将子视图绑定到children数组。如果我将子视图绑定到父视图并将ObjectList路径设置为/children,那么这将解决我的问题。我也可以获取视图的objectContext的路径并将其删除并以这种方式检索父值 - 但这感觉很笨,无论如何我使用XML视图声明。总的来说,我很顽固和好奇,想要了解使用相对路径的向上遍历。

我尝试过使用双点的相对路径方法,例如xpath:

headerText="Children of {../name}"

但这不起作用。我已经找到很多解释UI5中的绑定但没有讨论如此需要遍历模型。任何人都可以帮助解决方案或提供解决方案的文档链接吗?

3 个答案:

答案 0 :(得分:1)

如果这是OData你可以有一个指向子对象内部父对象的链接并通过它引用它,但据我所知,对于JSONModel没有这样的向上关系。

你真的在这里回答了你自己的问题。您要做的是将视图绑定到父级并使用相对路径引用子级。我不认为这是一个矮胖的。有什么缺点?您仍然会在模型中加载相同的数据,并且仍然以逻辑方式进行组织。

事实上,(稍微分散一点)像上面提到的那样加载一个oDataModel会给模型添加重复的值,当视图刚刚被绑定不同时,没有明显的优势。

答案 1 :(得分:0)

默认的JSONBinding实现不支持路径遍历。但是,通过在需要的位置设置不同的绑定上下文,可以轻松解决您的问题。我创建了一个example来模拟这个。包含子项的列表的项聚合直接绑定到children数组:

let path = "/parents/0";
let childrenTable = this.byId("children");
childrenTable.bindAggregation("items", {
    "path" : path + "/children",
    "template" : new StandardListItem({ "title" : "{name}"})
});

要显示父级的名称,我在列表中添加了一个工具栏,并将其绑定到模型中的相应父级。

childrenTable.getAggregation("headerToolbar").bindElement(path);

答案 2 :(得分:0)

我自己的解决方法是设法在控制器中获取子视图的父名称,然后使用

var list = this.byId("ChldrenList")
list.setHeaderText('Children for ' + mdlParent.name)  
// where mdlParent.name is my arbitrary model and attribute to be displayed.

我对此仍然不满意,因为它削弱了声明性XML视图方法的力量。但是我的老板说要吸吮它并继续前进8 - )