2016-10-11 8 views
1

Ich benutze 3.0.0-rc.4 von Js-Daten und ich brauche mehrere Modelle von einem einzigen Aufruf an die Back-End-API laden. Ich baue immer noch das Backend und würde es vorziehen, in der Lage zu sein, alle Daten von den verschiedenen Tabellen gleichzeitig zu erhalten, anstatt mehrere Anrufe zu verschiedenen Endpunkten zu machen.Js-Daten mehrere Modelle in einer einzigen Route

Antwort

2

Sie können. Sagen Sie, die Route, die Ihre Webanwendung laden soll, ist/posts/123, und Sie müssen Post # 123 und seine Kommentare laden, die sich in zwei verschiedenen Tabellen befinden. In Ihrem clientseitigen App können Sie so etwas wie

store.find('post', 123) 

oder sogar

store.find('post', 123, { params: { with: 'comment' } }) 

tun, die eine GET-Anforderung an so etwas wie /post/123 und /post/123?with=comment jeweils machen.

Ihr Backend kann mit dem Post-Datensatz mit eingebetteten Kommentaren antworten, und solange Sie JSData von der Beziehung zwischen Posts und Kommentaren berichten, werden sie jeweils im rechten Teil des In-Memory-Speichers zwischengespeichert. Zum Beispiel:

store.defineMapper('post', { 
    relations: { 
    hasMany: { 
     comment: { 
     localField: 'comments', 
     foreignKey: 'post_id' 
     } 
    } 
    } 
}); 
store.defineMapper('comment', { 
    relations: { 
    belongsTo: { 
     post: { 
     localField: 'post', 
     foreignKey: 'post_id' 
     } 
    } 
    } 
}); 

Sie tun:

store.find('post', 123) 

Ihr Backend antwortet mit:

{ 
    "id": 123, 
    // ... 
} 

Sie tun:

store.find('post', 123, { params: { with: 'comment' } }) 

Ihr Backend antwortet mit:

{ 
    "id": 123, 
    // ..., 
    comments: [ 
    { 
     "id": 14323, 
     "post_id": 123, 
     // ... 
    }, 
    // ... 
    ] 
} 

Wenn Sie Node.js + JSData im Backend verwenden, als https://github.com/js-data/js-data-express zu überprüfen, die die Abfragezeichenfolgeflag correctlly analysieren kann und alle die Express Routen für alle Ihre Mapper generieren. Mit js-data-express kann Ihr Backend genau auf die Anfragen antworten, wie ich in meinen obigen Beispielen angegeben habe.

Sobald Sie Daten in den In-Memory-Speicher geladen, Ihre View-Komponente die Daten ziehen kann es aus dem In-Memory-Speicher angezeigt werden muss:

Get Post # 123 aus der In-Memory Speicher:

store.get('post', 123) 

die Kommentare zu Post # 123 aus dem Laden in-memory-Adresse:

store.getAll('comment', 123, { index: 'post_id' }) 

Wenn Sie die DataStore Komponente verwenden, dann die Kommentare shou der Post ld auch auf dem Post-Datensatz selbst verfügbar sein, z. post.comments.

+0

große Antwort! Ich habe jedoch noch eine Follow-up-Frage. Js-data ist also schlau genug, um die Mehrzahl der empfangenen Daten aufzulösen, da das Speicherobjekt im Beispiel "Kommentar" ist, das empfangene verschachtelte Feld jedoch "Kommentare"? – jredd

+1

JSData weiß anhand der Einstellung "localField" in der Beziehungsdefinition, welches Feld die eingebettete Beziehung ist. – jdobry

Verwandte Themen