0

追跡クエリの 仕組みがわかりません。

ここに私のアプリケーションの一部があります:

グラフィック

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 subjectSubscriptionrender メソッドでは、値に応じてProgramCard表示するかどうかを指定します。ProgramSubjectRegistrationLinksubjectSubscription

問題は、クライアントによって行われる実際の変更が次のようになることです。

query:
  mutation ProgramSetSubjectSubscription($input_0:ProgramSetSubjectSubscriptionInput!){programSetSubjectSubscription(input:$input_0){clientMutationId}}

variables:
  {
  "input_0": {
    "programID": "UHJvZ3JhbTo1NjM2OTY1MzFiZGM3MzI1MmFlYTk4MWE=",
    "subjectSubscription": false,
    "clientMutationId": "0"
  }
}

subjectSubscription畑の跡はありません。どうして??

これを手伝ってくれてありがとう。私は本当にそれを理解することはできません!

4

1 に答える 1

0

の正しいスペルで動作しfieldIDsますか?

getConfigs() {
  return [
    {
      type: 'FIELDS_CHANGE',
      fieldIDs: {  // Instead of `fieldsIDs`
        program: this.props.program.id
      }
    }
  ];
}
于 2015-12-06T03:39:02.857 に答える