2016-11-25 2 views
1

Ich habe meine Daten wie folgend:Mapping Array von Arrays zu sap.m.Table Steuer

{ 
    meta: { 
       format: "csv", 
       info: "desc", 
       columns: [ 
       { 
        id: "Name", 
        type: "Text", 
        length: 32   
       }, 
       { 
        id: "Text", 
        type: "Text", 
        length: 128 
       }] 
      }, 
    rows: [ 
       ["John","xxxx"], 
       ["Alpha","yyyy"], 
       ["Beta","wwww"], 
       ["Gamma","zzzz"]] 
} 

Nun, ich kämpfen, um die Datensätze zu einer sap.m.Table Kontrolle als Columns und Rows abzubilden. Spalte scheint geradlinig, gerade Karte, aber die Zeilen sind Array-Array-Struktur. Gibt es eine Möglichkeit, diese Struktur zu binden, die kein Array von Objekten ist?

+0

Dies ist ein Duplikat http://stackoverflow.com/questions/40793535/how-to-map-model-to-table-when-the-structure-is-array-based. Was ist das Problem? Ist die angebotene Lösung nicht ausreichend? – matbtt

+0

@matbtt Es ist nicht genau ein Duplikat. Anstatt die Frage zu bearbeiten, die schon eine perfekte Antwort hat, dachte ich daran, mein Problem genau zu klären, wie ich es im Kommentar dieser Frage getan habe. Dieses ist eher ein ** SAPUI5/OPENUI5 ** -orientiertes Problem als eine JS-Lösung. – axiomtheorem

+0

Wenn du eine perfekte Antwort hast, solltest du sie akzeptieren. Dann kann jeder das sehen und der Antworter verdient Ansehen. – matbtt

Antwort

2

Offensichtlich ist es möglich, eine Eigenschaftsbindung zu erstellen, wenn Sie den Array-Index anstelle eines Eigenschaftsnamens verwenden.

<List id="list" items="{/rows}> 
    <columns> 
     <Column> 
      <Label text="{/meta/columns/0/id}"/> 
     </Column> 
     <Column> 
      <Label text="{/meta/columns/1/id}"/> 
     </Column> 
    </columns> 
    <items> 
     <ColumnListItem> 
      <cells> 
       <Text text="{0}"/> 
       <Text text="{1}"/> 
      </cells> 
     </ColumnListItem> 
    </items> 
</List> 

Dynamisch können Sie die Bindung wie folgt in der Steuerung tun. Es sollte leicht an Ihren Anwendungsfall anzupassen sein:

var list = this.byId("list"); 

list.bindAggregation("columns", { 
    "path" : "/meta/columns", 
    "template" : new sap.m.Column({ 
     "header" : new sap.m.Label({ 
      "text" : "{name}" 
     }) 
    }) 
}); 

list.bindAggregation("items", { 
    "path" : "/rows", 
    "template" : new sap.m.ColumnListItem({ 
     "cells" : [ 
      new sap.m.Text({ "text" : "{0}" }), 
      new sap.m.Text({ "text" : "{1}" }) 
     ]}) 
}); 

Die Liste darf keine verbindlichen Informationen enthalten.

Wenn Sie mehr Kontrolle über den Bindungsprozess benötigen, können Sie Factory-Funktionen anstelle von Vorlagen verwenden.

list.bindAggregation("columns", { 
    "path" : "/meta/columns", 
    "factory" : function(id, context) { 
     return new sap.m.Column({ 
      "header" : new sap.m.Label({ 
       "text" : "{name}" 
      }) 
     }); 
    } 
}); 
+0

Danke für die Antwort, aber das Problem, das ich hier nicht umgehen kann, ist die Anzahl der Spalten wird dynamisch sein. Gibt es eine Möglichkeit, die Spalten dynamisch zu binden? – axiomtheorem

+0

Nicht in einer deklarativen Weise. Wenn Sie möchten, dass Sie das programmieren müssen. – matbtt

+0

Genau. Ich bekomme keine Ideen, Spalten dynamisch zu binden und dann in Zeilen zu referenzieren. Ich sehe anderswo Leute _formatter_ erwähnen, aber ich bin neu in diesem UI5-Framework und nicht viel Ressourcen zu folgen. Ich konnte ähnliche Ergebnisse in ui.Table erzielen, indem ich die Lösung in meiner 1. Frage verwendete, aber m.Table ist komplett anders, sehe ich. – axiomtheorem