如何在getConfigs中为嵌套连接定义parentName,parentId和connectionName?

时间:2016-07-06 08:06:57

标签: relayjs

我遇到了在嵌套连接上编写Relay Mutation的一些问题。这是类型结构:

{ 
  viewer { 
    entity(id) { 
      events // mutate connection here
    }
  }
} 

在getConfigs中,我将parentName和parentID都指向" viewer"但是connectionName" events"它不存在于"实体"类型。

正如您将在下面的代码片段中看到的,我也不确定如何在getFatQuery中使用变量来获取具有实体ID的变异数据。

getConfigs和getFatQuery:

     getConfigs() {
        return [{
          type: 'RANGE_ADD',
          parentName: 'viewer',
          parentID: this.props.viewer.id,
          connectionName: 'events',
          edgeName: 'eventEdge',
          rangeBehaviors: {
            '': 'append'
          },
        }];
      }

      getFatQuery() {
        return Relay.QL`
          fragment on addEventPayload {
            viewer {
              entity(id: $entityId) // how do I use variables in the getFatQuery {
                events(first: 20) {
                  edges {
                    node {
                      status
                    }
                  }
                }
              }
            },
            eventEdge
          }
        `;
      }

如果没有任何意义,我非常乐意帮助澄清我的问题所以请随时提出有关我的问题的问题。

感谢您的帮助!

1 个答案:

答案 0 :(得分:3)

对于将来遇到此问题的任何人,您不必担心再次传入id或处理嵌套查询/字段。 Relay将在客户端上查找并更新相应的记录。 This issue on Github有助于解决这个问题,尤其是来自freiksenet的评论。

在上面的示例中 - 我们只是直接转到viewer,而不是通过entity

outputFields:

  outputFields: {
    eventEdge: {
      type: eventEdge,
      resolve: async({event}) => {
        const eventsByOwner = await Event.getEventsByOwnerId(event.ownerId)
        const eventIndex = eventsByOwner.findIndex(evt => evt.id == event.id);
        const cursor = offsetToCursor(eventIndex);
        return {
          cursor: cursor,
          node: event
        };
      }
    },
    entity: {
      type: entity,
      resolve: async({event}) => {
        return Entity.getEntity(event.ownerId)
      }
    },
  }

getConfigs和getFatQuery:

getConfigs() {
    return [{
      type: 'RANGE_ADD',
      parentName: 'entity',
      parentID: this.props.entityId,
      connectionName: 'events',
      edgeName: 'eventEdge',
      rangeBehaviors: {
        '': 'append'
      },
    }];
  }

  getFatQuery() {
    return Relay.QL`
      fragment on addEventPayload @relay(pattern: true) {
        entity {
          events
        },
        eventEdge
      }
    `;
  }

注意:使用@relay(pattern: true)可确保您在未通过连接查询的参数时遇到问题,并将回退到此类型的上一次查询。