2016-09-26 1 views
0

Ich bin ein Neuling zu ember. Also hier ist, was ich konfrontiert habe. Ich habe Backend-RESTAPI in Python/Django geschrieben. Es bietet folgende json Antwort auf /api/works/Ember Serializer Anpassung für alternative URL

[ 
{ 
    "id": 17, 
    "title": "about us", 
    "description": "some project", 
    "owner": "admin" 
}, 
{ 
    "id": 19, 
    "title": "test1 profit project", 
    "description": "dev null", 
    "owner": "test1" 
} 
] 

auch auf Detailansicht Beispiel: /api/works/17/:

{ 
"id": 17, 
"title": "about us", 
"description": "some project", 
"owner": "admin" 
} 

gibt es auch /api/works/17/tasks/ für Aufgaben Auflistung Arbeit

[ 
{ 
    "id": 2, 
    "title": "secondWorkTask", 
    "description": "task2 description", 
    "due_date": "2016-09-26", 
    "assign": 1, 
    "project": "about us" 
}, 
{ 
    "id": 3, 
    "title": "some task name", 
    "description": "some task description", 
    "due_date": "2016-08-27", 
    "assign": 2, 
    "project": "about us" 
} 
] 

auf der Front-End-Seite Ich verwende ember-cli Version 2.7.0 + ember-django-adapter. Ich kann/api/funktioniert ohne Probleme.

Serializer auf Ember zu bekommen Projekt:

export default DRFSerializer.extend({ 
    normalizeFindAllResponse(store, primaryModelClass, payload, id, requestType) { 
    payload.data = payload; 
    return this._super(...arguments); 
} 
}); 

Was ich erreichen möchte, ist auf der glut Seite, wenn die Arbeit Detail URL auf den glühenden Kohlen Seite (emberexample-app.com/app/17/) Last, sie alle Aufgaben zeigen müssen . Gegenwärtig kann ich Arbeit Detail durch diese URL /api/works/17/ mit über dem Serialisierer erhalten. Aber wie kann ich Aufgaben bekommen? Bitte helfen Sie mir, einen Weg zu finden, dies zu lösen.

Antwort

1

Der Serializer wird verwendet, um das Laden und Speichern (oder Serialisierung und Deserialisierung) von Daten anzupassen.

Um die URLs anzupassen, müssen Sie einen Adapter verwenden (z. B. RESTAdapter ist mein am häufigsten verwendeter Adapter).

, die in dem Fall, dass Sie erstellen möchten arbeiten (urlForCreateRecord) oder Update (urlForUpdateRecord) Aufgaben aber nicht direkt arbeiten können, wenn Sie nur eine work.get('tasks') nach einer belongsTo Beziehung zu einem GET http://endpoint/work/<work_id>/tasks konvertieren wollen, zumindest in meinem Fall es hat nicht "nur funktioniert" Ed.

Eine Lösung, die sehr gut funktioniert, ist das Hinzufügen einer Eigenschaft links als einfaches Objekt zu den übergeordneten Objekten, die Verknüpfungen zu den verschiedenen untergeordneten Modellen enthalten, die Sie als Eigenschaften abrufen möchten.

Etwas wie folgt aus:

/* app/adapters/work.js */ 
import DS from 'ember'; 

export default DS.RESTSerializer({ 
    normalize (model, hash, prop) { 
     hash.links = hash.links || {}; 
     hash.links.tasks = this.buildURL(model, hash.id) + '/tasks'; 
     return this._super(model, hash, prop); 
    } 
}); 

In diesem Beispiel, wenn Ember versuchen, eine Aufgaben-Eigenschaft von einem Arbeitsmodell zu erhalten, wird es ein GET auf die URL, dass work.links.tasks enthält.

+0

danke, mit Links ist die echte Option. – Zorig

+0

ist es möglich, eine Aufgabe in '/ api/works/17/tasks /' zu erstellen. Muss ich den Taskserializer für die Erstellungsaufgabe aktualisieren? Auch beide Funktionen sollten im Serialisierer vorhanden sein, oder? Die aktuelle Erstellung von Aufgaben ist nur unter '/ api/works/17/tasks /' möglich, aber beim Bearbeiten oder Löschen von Datensätzen unter '/ api/tasks/2 /' – Zorig

+1

Wenn DRFAdapter [DS.RESTAdapter] erweitert (http: // emberjs .com/api/data/classes/DS.RESTAdapter.html) (und [tut es]) (https://github.com/dustinfarris/ember-django-adapter/blob/master/addon/adapters/drf.js#) L21)) es ist möglich, die URL für jede Aktion individuell anzupassen, werfen Sie einen Blick auf die Methoden 'urlForDeleteRecord' und' urlForUpdateRecord' in DS.RESTAdapter. – Terseus