Relayjs fatquery не генерирует ожидаемый запрос

У меня есть псевдоструктура, которая выглядит/работает примерно так:

Organization <- OrganizationType
{
   TopLevelEmployees <- EmployeeType
   {
     id,
     Name,
     Pay,
     Subordinates <- EmployeeType
     {
        id,
        Name,
        Pay,
        Subordinates.if(variables.expanded)
     }
   },
   Departments <- DepartmentType
   {
      Name,
      Organization, <- OrganizationType
      Employees
   }
}

У меня есть элемент управления, который отображает древовидную структуру сотрудников.

<EmployeeTreeEditor Organization={organization} />

Затем у меня есть элемент управления, который редактирует отделы по отдельности.

<DepartmentEditor Department={department} />

Запрос Relay в DepartmentEditor выглядит следующим образом:

    fragments: {
    Department: () => Relay.QL`

      fragment on Department
      {
        Employees 
        {
           id,
           Name,
           Pay
        },
        Organization
        {
           id,
        }
      }

`}

В редакторе отдела есть кнопка, которая повышает оплату всех сотрудников в этом отделе на 10 % с помощью RaiseDepartmentPayMutation.

FatQuery для RaiseDepartmentPayMutation выглядит следующим образом:

    fragments: {
    Department: () => Relay.QL`

      fragment on Department
      {
         Organization
      }

   `}

RaiseDepartmentPayMutation возвращает OrganizationPayload.

Когда кнопка «Повысить оплату» нажата в редакторе отдела, я хотел бы полностью перезагрузить сотрудников организации TopLevelEmployees, поскольку их оплата могла измениться.

Проблема в том, что сгенерированный запрос основан на запросе Department::Organization и извлекает только идентификатор организации.

Я предполагаю, что если бы я передал организацию в редактор отдела вместо отдела, то он мог бы получить TopLevelEmployees, но я не могу продолжать передавать свою организацию дочерним элементам управления.

Другое решение, которое я вижу, может заключаться в том, чтобы иметь отдельный фрагмент, который я включаю как в EmployeeTreeEditor, так и в Mutation fatQuery.

${Something.getFragment('Organization')}

Но я не уверен, как fatQueries работают с древовидными структурами, поэтому я просто хотел бы перезагрузить всю организацию.

Есть ли в этом смысл?

Спасибо!


person Reyn    schedule 04.01.2016    source источник


Ответы (1)


Обзор

Как насчет:

  1. Обработка Organization как вашего самого верхнего контейнера с Organization как корневого фрагмента GraphQL
  2. Добавление ребер/узлов к Departments во фрагменте Organization GraphQL
  3. Использование Organization в качестве корня ваших фрагментов для DepartmentEditor, RaiseDepartmentPayMutation

Подробнее

  1. Для Organization:

(a) Добавьте ребра/узлы к Departments

(б) Удалить Organization в Departments

(c) Укажите, где DepartmentEditor и RaiseDepartmentPayMutation берут свои фрагменты

    fragments: {
      organization: () => Relay.QL`
        fragment on Organization {
          id,
          topLevelEmployees {
            id,
            name,
            pay,
            subordinates {
              id,
              name,
              pay,
            }
          },
          departments {
            edges {
              node {
                name,
                employees,
                ${DepartmentEditor.getFragment('department')},
              },
            },
          },
          ${RaiseDepartmentPayMutation.getFragment('organization')},
        },          
      `
    }
  1. Для DepartmentEditor, где вы будете вызывать RaiseDepartmentPayMutation в onClick(), передайте this.props.department

    // Call this when button to 'Raise Pay' is clicked
    // this.props.department comes from
    // ${DepartmentEditor.getFragment('department')}
    onClick() {
      Relay.Store.update(
        new RaiseDepartmentPayMutation({
          department: this.props.department,
        })      
      );  
    }
    
    // Department data that you need for display, etc.
    fragments: {
      department () => Relay.QL`
        fragment on Department {
          id,
          employees {
            id,
            name,
            pay,
          },
        },
      `
    }
    
  2. Для RaiseDepartmentPayMutation объявите аргументы, которые может передать вызывающая сторона этой мутации, используя getVariables(), т. е. аргумент Department, когда мутация вызывается onClick().

    // Declare that RaiseDepartmentPayMutation can accept a 
    // departmentId, which you derive from this.props.department
    // On the server side GraphQL schema, you need to use resolve to
    // retrieve the correct department based on this departmentId
    getVariables() {
      return {
        departmentId: this.props.department.id
      }
    }
    
    // Declare that Organization -> topLevelEmployees may change
    // due to this mutation
    getFatQuery() {
      return Relay.QL`
        fragment on Organization {
          topLevelEmployees
        }
      `
    }
    
    // Ensure that the organization ID is there
    fragments: {
      organization: () => Relay.QL`
    
        fragment on Organization {
          id,
        },
      `
    }
    
person nethsix    schedule 13.03.2016