在RANGE_ADD配置中指定的任何rangeBehaviors都不匹配

时间:2016-04-26 09:49:12

标签: reactjs graphql relayjs

我有以下突变:

export default class AddTaskMutation extends Relay.Mutation {
  static fragments = {
    classroom: () => Relay.QL`
      fragment on Classroom {
        id,
      }`,
  };

  getMutation() {
    return Relay.QL`mutation { addTask }`;
  }

  getFatQuery() {
    return Relay.QL`
      fragment on AddTaskPayload {
        classroom {
          taskList,
        },
        taskEdge,
      }
    `;
  }

  getConfigs() {    
    let rangeBehaviors = {};
    let member_id = 'hasNewMessages(true) member_id(' + Global.fromGlobalId(this.props.createdByMember)['id'] + ')';
    rangeBehaviors[''] = 'append';
    rangeBehaviors['hasToDo(true)'] = 'append';
    rangeBehaviors['hasToDo(false)'] = 'append';
    rangeBehaviors['isStart(true)'] = 'ignore';
    rangeBehaviors['isStart(false)'] = 'append';
    rangeBehaviors[`${member_id}`] = 'append';
    rangeBehaviors['hasNewMessages(true) member_id(null)'] = 'ignore';
    return [
      {
        type: 'RANGE_ADD',
        parentName: 'classroom',
        parentID: this.props.classroomId,
        connectionName: 'taskList',
        edgeName: 'taskEdge',
        rangeBehaviors,
      }
    ];
  }

  getVariables() {
    return {
      title: this.props.title,
      instruction: this.props.instruction,
      start_date: this.props.start_date,
      end_date: this.props.end_date,
      is_archived: this.props.is_archived,
      is_published: this.props.is_published,
      is_preview: this.props.is_preview,
      productId: this.props.productId,
      classroomId: this.props.classroomId,
      createdByMember: this.props.createdByMember,
      subTasks: this.props.subTasks,
      students: this.props.students,
    };
  }
}

运行我的应用程序时,我收到以下2个警告:

  

warning.js:44警告:RelayMutation:与ID taskList{hasNewMessages:true,member_id:null}对应的变异字段classroom上的连接Classroom:35与指定的rangeBehaviors中的任何一个都不匹配在您的RANGE_ADD配置中。这意味着将重新获取整个连接。配置此突变的范围行为,以便仅获取新边缘并启用乐观突变,或使用refetch压制此警告。

  

warning.js:44警告:不建议使用null作为rangeBehavior值。使用ignore以避免重新获取范围。

由于其他rangeBehaviors工作,我认为在一个行为中声明2个变量时必定会出现语法错误 - 在这种情况下hasNewMessagesmemeber_id

我已经找到了答案,但我找不到任何答案。这些文档似乎也没有涵盖这种边缘情况。

编辑:我也试过rangeBehaviors['hasNewMessages(true),member_id(null)'] = 'ignore';(逗号作为分隔符),但没有成功。

1 个答案:

答案 0 :(得分:2)

在检查了Relay(文件RelayMutationQuery.js)的源代码后,我可以看到它在所有rangeBehaviors的数组中搜索的数组键。然后我可以将我的代码更新为正确的格式。

由于我还没有在网上找到关于此边缘案例的任何内容,我将在此处发布我的解决方案 - 也许有人会发现它在将来会有所帮助。

如果rangeBehavior有2个(或更多)变量,则需要用句点(.)分隔它们。此外,在通过null时,您没有明确地通过它 - 只需将其从“'”中删除即可。变量

例如:

右:

rangeBehaviors['hasNewMessages(true).member_id()'] = 'ignore';

错误:

rangeBehaviors['hasNewMessages(true),member_id(null)'] = 'ignore';