2015-09-10 8 views
7

ho un server GraphQL in esecuzione con uno schema più o meno in questo modo:Come arrivare RelayJS per capire che una risposta da GraphQL è un array di oggetti, non solo un singolo elemento

type Card { 
    id: String! 
    name: String 
} 

type Query { 
    card(name: String!): Card 
    cards(power: String): [Card] 
} 

Si noti che ho un interrogare su una singola carta, ma anche su più schede. Quando uso l'interfaccia utente GraphIQl e faccio una query come questa "query {cards {name}}" torno indietro una serie di carte, come previsto.

Tuttavia, ho un RelayContainer che sta facendo la stessa query, ma gli oggetti di scena che ritornano sono solo il primo risultato, piuttosto che una serie di risultati.

class MyApp extends React.Component { 
    render() { 
    return (
     <div> 
     <h1> Hello world!</h1> 
     <CardList cards={this.props.cards} /> 
     </div> 
    ); 
    } 
} 

export default Relay.createContainer(MyApp, { 
    fragments: { 
    card:() => Relay.QL` 
     fragment on Card { 
     name 
     } 
    `, 
    cards:() => Relay.QL` 
     fragment on Card { 
     ${CardList.getFragment('cards')} 
     } 
    ` 
    }, 
}); 

e la componente cardlist è impostato con il contenitore come questo:

class CardList extends React.Component { 
    render() { 
    return <div>{this.props.cards}</div> // UNEXPECTED - this.props.cards is the first card, not an array for me to .map over 
    } 
} 

export default Relay.createContainer(CardList, { 
    fragments: { 
    cards:() => Relay.QL` 
     fragment on Card { 
     name 
     } 
    `, 
    }, 
}); 

Qualcuno ha qualche suggerimento? Questo è il mio secondo giorno di immersione in GraphQL e Relay, quindi potrei fare un errore molto semplice per quanto ne so.

+0

Dai un'occhiata a come funziona l'esempio TODO Relay. Lo schema GraphQL non è corretto per Relay poiché è necessario utilizzare 'connectionsDefinition' da https://github.com/graphql/graphql-relay-js https://github.com/facebook/relay/blob/a04a51486c2576c4a0dcdb091023e1bda0d0a5fe/examples /todo/data/schema.js#L93-L100 –

risposta

10

Probabilmente si desidera una direttiva @relay(plural: true) sul frammento di query cards. C'è un esempio di un campo plurale nell'azione in the Star Wars example nel repository Relay.

Se si preoccupa dell'impaginazione, tuttavia, probabilmente si desidera una connessione anziché un campo plurale. I collegamenti sono descritti in the Relay docs e implementati in graphql-relay-js.

+0

Grazie, sto iniziando questo percorso da esplorare. Una cosa che non sono ancora completamente groking è che tutti gli esempi mostrano una connessione che inizia con un oggetto singolare alla base. per esempio. La fazione ha molte navi, Todo ha molti oggetti di Todo, ecc. Tuttavia, cosa succede se vuoi una cosa al plurale alla radice? (ad es. AllShips) –

+3

Al momento non è possibile avere una connessione alla radice. Questa è una limitazione nota, ma abbiamo in programma di risolverlo e il progresso è [essere tracciati qui] (https://github.com/facebook/relay/issues/112). Per ora, la soluzione è racchiudere tali cose in un altro campo radice (come, 'viewer', per esempio). – wincent

+0

Quindi una connessione è il modo appropriato per abilitare l'impaginazione specifica del Relay? Anche se non si riferisce alle relazioni tra entità, ma solo una query sugli account, dove potrebbero esserci milioni di account? – Ryan

Problemi correlati