2017-01-26 2 views
0

У меня есть отношения родитель-потомок в модели 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"}]} 
      ] 
} 

Затем, если выбрать родительскую Spartacus ', то вид, показывающий детей, должны иметь в качестве названия Children of Spartacus.

Важно: По различным причинам у меня есть дочерний вид, связанный с массивом children. Если я привязал дочерний вид к родительскому элементу и установил путь ObjectList к /children, тогда это решило бы мою проблему. Я мог бы также получить путь для objectContext представления и измельчить его и получить родительское значение таким образом - но это кажется неуклюжим, и в любом случае я использую заявление XML-представления. В целом я упрямый и любопытный и хочу знать о восходящем обходе с использованием относительных путей.

Я попытался относительный подход путь, используя двойные точки как можно было бы, например, XPath:

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

Но это не работает. Я нашел много, чтобы объяснить привязки в UI5, но ничего не обсуждают прохождение модели, как это требуется здесь. Может ли кто-нибудь помочь с решением или ссылкой на документы, которые дают решение?

ответ

0

Реализация JSONBinding по умолчанию не поддерживает обход трассировки. Однако можно легко решить вашу проблему, установив другой контекст привязки, где это необходимо. Я создал example, имитируя это. Агрегация элементы списка, содержащего детей непосредственно связана с массивом детей:

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); 
+0

Хорошо спасибо за другую полезную технику. Я слегка удивлен, что UI5 предлагает более простой метод, потому что это должен быть общий шаблон. Также в какой-то степени он разбавляет силу декларативного подхода к представлению XML. –

+1

Я бы установил контекст привязки представления, показывающего дочерние элементы родительскому элементу, а не дочернему массиву. Я не знаю, поддерживают ли другие фреймворки, но UI5 достаточно гибкий, чтобы подключить ваш собственный синтаксис привязки. ;) – matbtt

1

Если бы это OData, вы могли бы иметь ссылку на родителя внутри дочерних объектов и ссылаться на него через это, но, насколько мне известно, для JSONModel нет таких отношений вверху.

Вы действительно ответили на свой вопрос здесь. То, что вы хотите сделать, - привязать представление к родительскому объекту и указать дочерние элементы с относительным путем. Я не вижу этого коротким. Каков недостаток? Вы по-прежнему будете загружать одни и те же данные в модель и все равно организованы логически.

Фактически, (чтобы немного отклониться) загрузка oDataModel, как я упомянул выше, добавит повторяющиеся значения к модели без очевидного преимущества, когда представление может быть просто связано по-разному.

+0

Спасибо - вопрос был ухищрен, чтобы дать возможность восходящего обхода в модели JSON.Одна вещь, которую нужно подобрать, заключается в том, что я использую элемент управления List, который AFAIK имеет одну возможность связывания, которую я использую для привязки к массиву children модели. Но я не могу привязать LIst.headerText к чему-то другому - это стало причиной требования об обратном восхождении. Именно поэтому Матбет в своем ответе использовал отдельное текстовое поле в качестве заголовка. Спасибо за ваши мысли. –

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-)

+2

Босс всегда прав ... на работе и дома. : D – matbtt

Смежные вопросы