2016-12-07 1 views
2

I Angular2 mit GraphQL über Apollo-Client verwendet werden versuchen. Ich habe die Dokumentation verfolgt und alles scheint gut zu funktionieren. Die Dokumentation erläutert jedoch nur, wie Sie aus den Komponenten eine Verbindung zu GraphQL herstellen können. Es gibt keine Informationen darüber, wie man Dienste für Serveraufrufe nutzt oder was für mich noch wichtiger ist, wie man Angular2-Routenresolver mit Apollo-Abfrage oder watchQuery verwendet.Angular2 Dienste und Strecke Resolvern mit GraphQL

Ich habe eine Lösung gefunden, wie man diese Logik in den Dienst mit Apollo-Abfrage versetzt, und es scheint zu funktionieren, aber ich kann es nicht mit Apollo watchQuery Methode arbeiten. Hat jemand eine Idee zur möglichen Lösung?

Oder mein Ansatz vielleicht bewegen GraphQL Anrufe an Dienstleistungen und die Nutzung von Resolver ist falsch und GraphQL Logik einfach in Komponenten gelassen werden soll?

+0

Haben Sie jemals eine Lösung für diese finden? Wir stoßen auf das gleiche Problem. – Brian

+0

Leider habe ich keine Lösung für die Bewegung 'watchQuery''ies zu Dienstleistungen und Strecke Resolver, aber auf der anderen Seite finden, fand ich die Lösung für die Bewegung all' query''ies zu diesen Klassen. Nehmen wir an, dass ich vorübergehend herausgefunden habe, dass 'watchQuery' für meinen Fall nicht notwendig ist. Wenn Sie möchten, kann ich Ihnen einige Codebeispiele zeigen und die Lösung zum Verschieben von Abfragen an Dienste und Resolver präsentieren. ?? – Marcin

+0

Wenn Sie einige Codebeispiele bereitstellen könnten, wäre das großartig! Danke für die Antwort! – Brian

Antwort

2

Wie ich im Kommentar erwähnt habe ich eine Lösung für den Umzug nach query 'ies zu Dienstleistungen oder Resolver gefunden, aber immer noch kein Glück mit watchQuery' ies (aber ich habe auch festgestellt, dass sie nicht wirklich notwendig für meine Anwendung).

Im Folgenden werde ich Ihnen einige Schnipsel geben, die hilfreich sein können.

definiere ich Methoden, die für die Durchführung von Abfragen in meinem Dienst verantwortlich sind:

public allItems(): Observable<ApolloQueryResult<Object>> { 
    return this.apollo.query({ 
    query: allItemsQuery 
    }); 
} 

Wo allItemsQuery ein Konstante Query-String:

export const allItemsQuery = gql` 
    query allItems { 
    items { 
     id 
     name 
    } 
    } 
`; 

als in meinen Resolvern ich die Methode einfach anrufen allItems aus der Service:

public resolve(route: ActivatedRouteSnapshot): Observable<ApolloQueryResult<Object>> | boolean { 
    return this.itemsService.allItems ? this.itemsService.allItems() : false; 
} 

Und Extrakt Route aufgelöste Daten in meiner Komponente:

this.activatedRoute.data.subscribe(data: {items: Item[]}) => { 
    console.log(items) 
} 

Natürlich, wenn in der Routing-Konfiguration Resolver mit Namen items wie genannt wird:

{ 
    path: 'items', 
    component: ItemsComponent, 
    resolve: { 
    items: ItemsResolve 
    } 
} 

Wenn Sie die Abfragen nicht über die Verwendung Resolver können Sie natürlich gewünschte Methoden aus den Komponenten aufrufen und dort abonnieren. Es gibt auch eine Möglichkeit, in den Diensten abonnieren und Rück Ebene Objekte/Arrays statt Observable<ApolloQueryResult<T>> aber aufgrund von Zeichnungen/unsubcriptions Ich denke, dass die vorgestellte Lösung ist bequemer.

+0

Es sieht so aus, als ob es funktioniert, oder? Siehe hier: https://github.com/apollographql/apollo-angular/issues/280 - auch, warum willst du 'watchQuery' vs' query' verwenden? – Sammy

Verwandte Themen