2017-01-20 3 views
0

In einer XML-Ansicht habe ich ein JSON-Modell, das an die Seite mit dem Namen 'foo' gebunden ist. Das Objekt des Modells hat ein "Name" -Feld und eine Kindsammlungsleiste (mit einem "Code" -Feld), die ich in einer Liste anzeigen möchte. Dies wird als solche modelliert:Aggregationsbindung an Child-Collection

JS-Code

var foo = { name:'My Name', bar:[{ code:'Code 1' }, { code:'Code 2' }] } 
var fooModel = new sap.ui.model.JSONModel(foo); 
page.setModel(fooModel, 'foo'); 
page.bindElement('foo>/'); 

XML Markup

<Label text='{foo>name}'/> 
<List items='{foo>bar}'> 
    <StandardListItem title='{foo>code}'/> 
</List> 

Beachten Sie, dass die Werte des Listenelement für das Kind 'bar' Array werden über den Namen 'foo' aufgelöst. Zumindest funktioniert das für mich und ich habe keine andere Möglichkeit gefunden, sie in der Liste zu referenzieren.

Aber das Problem ist, wie bekomme ich die Top-Level 'foo' Objektdaten in meiner Liste-Artikel auch? Angenommen, ich wollte das Feld "Name" auch in den Listenelementen anzeigen? Mit anderen Worten, gibt es eine Möglichkeit, das Äquivalent des folgenden zu tun, wo ich die Child-Sammlung unter einem anderen Namen verweisen kann? Gibt es einen Weg, dies zu erreichen?

<List items="{ path:'foo>bar', name='bar' }"> 
    <StandardListItem title='{bar>code}' info='{foo>name}' /> 
</List> 

Antwort

0

Sie müssen einen absoluten Pfad verwenden, um die name-Eigenschaft zu binden. Absolut bedeutet den vollständigen Pfad zu der Eigenschaft in Ihrem Modell. Das Gegenteil ist ein relativer Bindungsweg. Hier verwenden Sie einfach eine Eigenschaft innerhalb Ihres Modells und legen einen Bindungskontext fest, um der Laufzeit zu sagen, wo sich Ihre Eigenschaft im Modell befindet. Sie tun dies, indem Sie:

page.bindElement("foo>/"); 

Nun ist die Laufzeit wird diese Information an alle relativen Bindungen gegen das Modell anwenden foo auf der Seite. Daher können Sie foo>bar schreiben und die Laufzeit automatisch nachschlagen foo>/bar. Bei der Aggregation von Items funktioniert dies jedoch nicht, weil das Objekt bar keine Eigenschaft name hat. Daher müssen Sie einen absoluten Bindungspfad verwenden, um die Eigenschaft zu binden.

<List items="{foo>bar}"> 
    <StandardListItem title='{foo>code}' info='{foo>/name}' /> 
</List> 

finden Sie eine Erklärung der Bindungssyntax für JSONModel im documenation.

+0

Danke für die Antwort. Was für mich funktionierte, war info '{foo>/name}', also funktionierte die Absolute-Path-Technik. (Ich habe meinen ersten Post mit einer #bindElement-Korrektur bearbeitet, die wahrscheinlich für die kleine Diskrepanz zwischen Ihrer Antwort und dem, was bei mir funktioniert hat, verantwortlich ist.) – dlgrasse

+0

Wo das nicht funktioniert, ist wenn ich eine Liste innerhalb einer Liste habe. Das heißt, es gibt ein Array von 'foo'-Objekten mit jeweils' bar'-Arrays. Wenn ich die oberste Liste an "items = '{foo> /}'" und die innere 'bar'-Liste mit "items =' {foo> bar '}" anbinde, kann ich nicht auf das übergeordnete Objekt verweisen (und ich habe verschiedene Permutationen der Antwort versucht, die Sie gaben). Wenn das unklar ist, werde ich meinen ursprünglichen Beitrag bearbeiten, um dieses zweite Beispiel aufzunehmen. – dlgrasse

+0

Sind Sie sicher, dass Sie page.bindElement ("foo> /") verwenden. Es sollte "foo>/foo" sein, um auf Ihr Objekt foo innerhalb des Modells zu zeigen. – matbtt

Verwandte Themen