2017-01-26 2 views
0

Ich habe eine Eltern-Kind-Beziehung in einem JSON-Modell. Ich habe eine Ansicht, die die Eltern auflistet, die eine ObjectList verwenden. Das Pressetereignis eines Elements in dieser Liste navigiert zu einer anderen Ansicht, in der eine ähnliche Objektliste die untergeordneten Objekte des ausgewählten übergeordneten Objekts anzeigt.Name des ausgewählten Elternteils in Ansichtslisten-Kindern anzeigen

Ich möchte in der Lage sein, den Titel der Ansicht, die die Kinder anzeigen, ein Attribut des Elternteils zu machen. Wenn zum Beispiel das Modell:

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

Dann, wenn ich Eltern Spartacus "und wählen Sie dann die Ansicht, die Kinder zeigen, als Titel Children of Spartacus haben sollte.

Wichtig: Aus verschiedenen Gründen ist die untergeordnete Ansicht an das untergeordnete Array gebunden. Wenn ich die untergeordnete Ansicht an die Eltern anbinden und den Objektlistenpfad auf /children setzen würde, würde dies mein Problem lösen. Ich könnte auch den Pfad für den objectContext der Ansicht bekommen und es zerhacken und den Elternwert auf diese Weise abrufen - aber das fühlt sich klobig an und trotzdem verwende ich die XML-Ansichtsdeklaration. Insgesamt bin ich stur und neugierig und möchte über relative Traversen nach oben erfahren.

Ich habe einen relativen Pfad Ansatz mit doppelseitigem Punkt versucht, wie man es in zum Beispiel XPath:

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

Aber das funktioniert nicht. Ich habe in UI5 vieles gefunden, um Bindungen zu erklären, aber nichts diskutiert das Modell zu durchlaufen, wie es hier erforderlich ist. Kann jemand mit einer Lösung oder einem Link zu Dokumenten helfen, die eine Lösung bieten?

Antwort

0

Die standardmäßige JSONBinding-Implementierung unterstützt keine Pfadüberquerung. Es ist jedoch möglich, Ihr Problem einfach zu lösen, indem Sie einen anderen Bindungskontext dort festlegen, wo er benötigt wird. Ich habe eine example erstellt, die das simuliert. Die Artikel Aggregation der Liste, die die Kinder enthält, auf die Kinder-Array direkt gebunden ist:

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

den Namen der Eltern zu zeigen, habe ich eine Symbolleiste in die Liste und binden sie an die entsprechenden Eltern im Modell.

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

Ok danke für eine weitere nützliche Technik. Ich bin leicht überrascht, dass UI5 keine einfachere Methode bietet, weil dies ein allgemeines Muster sein muss. Außerdem wird die Aussagekraft des deklarativen XML-View-Ansatzes in gewissem Maße verwässert. –

+1

Ich würde den Bindungskontext der Ansicht festlegen, in der die untergeordneten Elemente anstelle des untergeordneten Arrays angezeigt werden. Ich weiß nicht, ob andere Frameworks dies unterstützen, aber UI5 ist flexibel genug, um Ihre eigene Bindesyntax anzuschließen. ;) – matbtt

1

Wenn dies OData wäre, könnten Sie eine Verbindung zu den Eltern in den Child-Objekten haben und durch sie darauf verweisen, aber soweit ich weiß, gibt es für ein JSONModel keine Aufwärtsbeziehung wie diese.

Sie haben Ihre eigene Frage hier wirklich beantwortet. Sie möchten die Ansicht an das übergeordnete Element binden und die untergeordneten Elemente mit dem relativen Pfad referenzieren. Ich sehe das nicht als klobig an. Was ist der Nachteil? Sie würden immer noch die gleichen Daten in das Modell laden und es ist immer noch in einer logischen Weise organisiert.

Tatsächlich (um ein wenig zu divergieren) würde das Laden eines oDataModels, wie ich oben erwähnt habe, wiederholte Werte zum Modell hinzufügen, ohne offensichtlichen Vorteil, wenn die Ansicht einfach anders gebunden sein könnte.

+0

Danke - die Frage wurde erfunden, um die Notwendigkeit für eine Aufwärts-Traversal in einem JSON-Modell geben.Eine Sache, die man aufgreifen sollte, ist, dass ich ein List-Steuerelement verwende, welches AFAIK eine Bindungsmöglichkeit hat, die ich verwende, um an das Child-Array des Modells zu binden. Aber ich kann den LIst.headerText nicht an etwas anderes binden - das war der Grund für die Anforderung des Aufwärtsdurchlaufs. Es ist auch der Grund, warum Matbtt in seiner Antwort ein separates Textfeld als Kopfzeile verwendet hat. Danke für deine Gedanken. –

0

Meine eigene Abhilfe ist ersinnen die übergeordneten Namen in der Steuerung erhalten für die Kinder zu sehen, dann

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

bleibe ich unzufrieden mit dem, wie er die Kraft der deklarativen XML-Ansicht verdünnt Ansatz. Aber mein Chef sagt zu saugen und weitergehen 8-)

+2

Der Chef hat immer Recht .... bei der Arbeit und zu Hause. : D – matbtt

Verwandte Themen