Comment obtenir l'identité d'un nouvel objet à partir d'une mutation?

J'ai une mutation createObject qui renvoie l'ID du nouvel objet.

Après le retour, je souhaite rediriger vers une page de détail sur le nouvel objet.

Comment puis-je obtenir des champs de réponse à partir d'une mutation dans le composant contenant en utilisant réactivité / relais?

Par exemple, ma page createObject contient la mutation avec un code comme:

 var onFailure = (transaction) => { }; var onSuccess = () => { redirectTo('/thing/${newthing.id}'); // how can I get this ID? }; // To perform a mutation, pass an instance of one to `Relay.Store.update` Relay.Store.update(new AddThingMutation({ userId: this.props.userId, title: this.refs.title.value, }), { onFailure, onSuccess }); } 

newthing doit être l'objet créé par la mutation, mais comment puis-je l'obtenir?

Normalement, nous configurons le côté client de la mutation avec RANGE_ADD et RANGE_ADD une nouvelle thingEdge du côté serveur de la mutation, mais ici, vous n'avez pas une plage sur le client pour ajouter le nouveau nœud. Pour indiquer à Relay de récupérer un champ arbitraire, utilisez la configuration REQUIRED_CHILDREN .

Mutation côté serveur

 var AddThingMutation = mutationWithClientMutationId({ /* ... */ outputFields: { newThingId: { type: GraphQLID, // First argument: post-mutation 'payload' resolve: ({thing}) => thing.id, }, }, mutateAndGetPayload: ({userId, title}) => { var thing = createThing(userId, title); // Return the 'payload' here return {thing}; }, /* ... */ }); 

Mutation côté client

 class AddThingMutation extends Relay.Mutation { /* ... */ getConfigs() { return [{ type: 'REQUIRED_CHILDREN', // Forces these fragments to be included in the query children: [Relay.QL` fragment on AddThingPayload { newThingId } `], }]; } /* ... */ } 

Exemple d'utilisation

 var onFailure = (transaction) => { // ... }; var onSuccess = (response) => { var {newThingId} = response.addThing; redirectTo(`/thing/${newThingId}`); }; Relay.Store.update( new AddThingMutation({ title: this.refs.title.value, userId: this.props.userId, }), {onSuccess, onFailure} ); 

Notez que tous les champs que vous recherchez en utilisant cette technique seront mis à la onSuccess rappel de l' onSuccess , mais ne seront pas ajoutés au magasin côté client.