2015-09-16 4 views
4

Использование Relay и GraphQL, скажем, что у меня есть схема, которая возвращает средство просмотра, и встроенный список связанных документов. Корневая запрос (составленный с фрагментами) будет выглядеть как-то вроде этого:Получение дополнительной информации для определенного элемента списка в relay/graphql

query Root { 
    viewer { 
    id, 
    name, 
    groups { 
     edges { 
     node { 
      id, 
      name, 
     } 
     } 
    } 
    } 
} 

Это позволит мне показать пользователю, и список всех связанных с ней группировок.

Теперь предположим, что я хочу, чтобы пользователь мог нажать на этот элемент списка и расширить его, чтобы показать комментарии, связанные с этим конкретным элементом списка. Как я должен реструктурировать свой запрос для маршрута ретрансляции, чтобы получить эти комментарии? Если я добавлю край комментариев к краю групп, то не будет ли он получать комментарии для всех групп?

query Root { 
    viewer { 
    id, 
    name, 
    groups { 
     edges { 
     node { 
      id, 
      name, 
      comments { 
      edges { 
       node { 
       id, 
       content 
       } 
      } 
      } 
     } 
     } 
    } 
    } 
} 

Или мне нужно изменить запрос маршрута, чтобы найти определенную группу?

query Root { 
    group(id: "someid"){ 
    id, 
    name, 
    comments { 
     edges { 
     node { 
      id, 
      content 
     } 
     } 
    } 
    }, 
    viewer { 
    id, 
    name, 
    groups { 
     edges { 
     node { 
      id, 
      name, 
     } 
     } 
    } 
    } 
} 

Меня беспокоит, в частности, используя это в контексте relay. I.e., как я могу эффективно построить запрос маршрута, который будет получать только комментарии для расширенного элемента списка (или элементов), но при этом все еще использует кэшированные данные, которые уже существуют, и будет обновляться при выполнении мутаций? Вышеприведенный пример может работать для определенной расширенной группы, но я не уверен, как я мог бы развернуть несколько групп одновременно, не получая эти поля для всех элементов группы.

ответ

5

Реле 0.3.2 будет поддерживать директивы @skip и @include.

Group = Relay.createContainer(Group, { 
    initialVariables: { 
    numCommentsToShow: 10, 
    showComments: false, 
    }, 
    fragments: { 
    group:() => Relay.QL` 
     fragment on Group { 
     comments(first: $numCommentsToShow) @include(if: $showComments) { 
      edges { 
      node { 
       content, 
       id, 
      }, 
      }, 
     }, 
     id, 
     name, 
     } 
    `, 
    }, 
}); 

В вашем методе визуализации, только делает замечание, если this.props.group.comments определен. Вызовите this.props.relay.setVariables({showComments: true}) в компоненте Group, чтобы включить поле комментариев (и при необходимости, при необходимости).

class Group extends React.Component { 
    _handleShowCommentsClick() { 
    this.props.relay.setVariables({showComments: true}); 
    } 
    renderComments() { 
    return this.props.group.comments 
     ? <Comments comments={this.props.group.comments} /> 
     : <button onClick={this._handleShowCommentsClick}>Show comments</button>; 
    } 
    render() { 
    return (
     <div> 
     ... 
     {this.renderComments()} 
     </div> 
    ); 
    } 
} 
+1

Ради интереса, в: https://github.com/facebook/relay/commit/5330ba5ce697d13febd018f2baac8aedff06bfd6 – steveluscher

+1

Есть ли способ, чтобы принести дополнительные данные для одного элемента в запросе списка (_edges_)? ** Почему? ** Я пытаюсь легко перемещать/масштабировать элемент списка в один элемент. Я тестировал все стратегии, но не могу найти способ. – Solo

+0

Да. На данный момент вы хотите показать представление одного элемента, вы узнаете идентификатор элемента. В этот момент представление одного элемента должно свернуться с запросом ** node ** в корне. 'node (id: $ itemID) {$ {Component.getFragment ('item')}}'. Поскольку элемент уже находится в хранилище из ** ** ** выборки, дополнительный сетевой запрос не потребуется. – steveluscher