hat vor kurzem angefangen, mit graphQL und Apollo - apollo-client herumzuspielen.Wie kann eine graphql-Mutation eine von Apollo Client beobachtete Abfrage automatisch aktualisieren?
Ich baute einen Web-Service über graphQL und es funktioniert gut. Das einzige Problem, mit dem ich konfrontiert bin, ist auf der Client-Seite des Projekts. Zum Beispiel (siehe Code unten), nach dem Ausführen von createVideo() die data
Eigenschaft meiner Komponente, die eine beobachtbare ist, die die Abfrage nicht automatisch aktualisiert und apollo.query manuell auf den Callback aufrufen scheint nicht zu nehmen Jeder Effekt, da die Abfrage die zwischengespeicherten Ergebnisse zurückgibt, nicht die vom Server zurückgegebenen Ergebnisse.
Fehle ich etwas?
app.component.ts
import {Component, OnInit} from '@angular/core';
import {Apollo, ApolloQueryObservable} from 'apollo-angular';
import 'rxjs/Rx';
import gql from 'graphql-tag';
// http://dev.apollodata.com/angular2/mutations.html
const NewVideoQuery = gql`
mutation AddVideoQuery($title: String!,$duration: Int!, $watched: Boolean!){
createVideo(video: { title: $title, duration: $duration, watched: $watched }){
id,
title
}
}
`;
const VideoQuery = gql`
{
videos {
id,
title
}
}
`;
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent implements OnInit {
data: ApolloQueryObservable<any>;
video: any = {};
constructor(private apollo: Apollo) {
}
ngOnInit() {
this.data = this.apollo.watchQuery({query: VideoQuery});
}
createVideo() {
/**
* This will send a mutate query to the server.
*/
// @todo After running the mutate, the watch query doesn't refresh
this.apollo.mutate({
mutation: NewVideoQuery,
variables: {
'title': this.video.title || 'Some Video' + Math.floor(Math.random() * 10),
'duration': 123213,
'watched': true
}
}).subscribe((afterMutation) => {
console.log(afterMutation);
// This fires but query doesn't hit the server since it's coming from cache.
// @todo Not even by re-running it here
this.apollo.query({query: VideoQuery})
.subscribe((data) => {
console.log(data);
});
}, (err) => alert(err));
}
}
//app.component.html
<div *ngFor="let x of data | async | select: 'videos'">
<div><b>{{x.id}}</b>{{x.title}}</div>
</div>
<label>
Title
<input type="text" [(ngModel)]="video.title">
</label>
<button (click)="createVideo()">{{title}}</button>
Hey! Entschuldigen Sie die Störung, aber ich habe ein ähnliches Problem wie Sie (https://stackoverflow.com/questions/48491160/update-state-with-apollo-client) festgestellt. Können Sie etwas über das Caching von Apollo-Clients, überwachte Abfragen und Abonnements lesen? Offizielle Dokumente scheinen ziemlich vage über diese Themen und Apollo-Client-Modul im Allgemeinen, kann ich nicht viel Sinn machen. Sie haben mir geholfen, ein Problem zu lösen, aber ich verstehe nicht, was hinter dem von Ihnen beschriebenen Mechanismus steht. –