追跡クエリの 仕組みがわかりません。
ここに私のアプリケーションの一部があります:
グラフィック
type Admin implements Node {
id: ID!
program(slug: String!): Program
}
type Program implements Node {
id: ID!
slug: String!
assessmentLink: String!
subjectSubscription: Boolean!
}
input ProgramSetSubjectSubscriptionInput {
programID: ID!
subjectSubscription: Boolean!
clientMutationId: String!
}
type ProgramSetSubjectSubscriptionPayload {
program: Program
clientMutationId: String!
}
type Mutations {
programSetSubjectSubscription(input: ProgramSetSubjectSubscriptionInput!): ProgramSetSubjectSubscriptionPayload
}
サーバー側の変異
import {
GraphQLBoolean,
GraphQLFloat,
GraphQLID,
GraphQLInt,
GraphQLList,
GraphQLNonNull,
GraphQLObjectType,
GraphQLInputObjectType,
GraphQLSchema,
GraphQLString
} from 'graphql';
import {
fromGlobalId,
mutationWithClientMutationId,
cursorForObjectInConnection,
offsetToCursor
} from 'graphql-relay';
import _ from 'lodash';
import db from '../../db';
import Program from '../types/Program';
import Admin, { ProgramEdge } from '../types/Admin';
export default mutationWithClientMutationId({
name : 'ProgramSetSubjectSubscription',
inputFields : {
programID : {
type : new GraphQLNonNull( GraphQLID )
},
subjectSubscription : {
type : new GraphQLNonNull( GraphQLBoolean )
}
},
async mutateAndGetPayload({ programID, subjectSubscription }) {
const Program = db.model('Program');
const localProgramId = fromGlobalId( programID ).id;
const program = await Program.findById( localProgramId ).exec();
program.subjectSubscription = subjectSubscription;
await program.save();
return {
localProgramId : program.id
};
},
outputFields : {
program : {
type : Program,
async resolve({ localProgramId }) {
const Program = db.model('Program');
return await Program.findById( localProgramId ).exec();
}
}
}
});
クライアント側の突然変異
import Relay from 'react-relay';
export default class ProgramSetSubjectSubscription extends Relay.Mutation {
static fragments = {
program() {
return Relay.QL`
fragment on Program {
id
}
`
}
};
getMutation() {
return Relay.QL`mutation{programSetSubjectSubscription}`;
}
getFatQuery() {
return Relay.QL`
fragment on ProgramSetSubjectSubscriptionPayload {
program {
subjectSubscription
}
}
`;
}
getConfigs() {
return [
{
type: 'FIELDS_CHANGE',
fieldsIDs : {
program : this.props.program.id
}
}
];
}
getVariables() {
return {
programID : this.props.program.id,
subjectSubscription : this.props.subjectSubscription
};
}
}
今、私は次のようなContainer
呼び出しProgramCard
を持っていfragment
ます:
fragment on Program {
name,
assessmentLink,
subjectSubscription,
${ProgramAutoInviteToggle.getFragment('program')}
${ProgramSubjectRegistrationLink.getFragment('program')}
}
Mutation
によって呼び出され、このフィールドProgramAutoInviteToggle
の値を切り替える必要があります。Program
subjectSubscription
render メソッドでは、値に応じてProgramCard
表示するかどうかを指定します。ProgramSubjectRegistrationLink
subjectSubscription
問題は、クライアントによって行われる実際の変更が次のようになることです。
query:
mutation ProgramSetSubjectSubscription($input_0:ProgramSetSubjectSubscriptionInput!){programSetSubjectSubscription(input:$input_0){clientMutationId}}
variables:
{
"input_0": {
"programID": "UHJvZ3JhbTo1NjM2OTY1MzFiZGM3MzI1MmFlYTk4MWE=",
"subjectSubscription": false,
"clientMutationId": "0"
}
}
subjectSubscription
畑の跡はありません。どうして??
これを手伝ってくれてありがとう。私は本当にそれを理解することはできません!