2016-04-05 19 views
0

Wie generiert graphql hasNextPage, wenn nur der "erste" Parameter übergeben wurde? Ich bin mitGraphQL Relay hasNextPage

return relay.connectionFromPromisedArray( global.app.get('model__user').getUsers(args), args );

und query:

query RootQueryType { viewer { user(id: 1){ id,email,friends(first: 5) {edges {cursor, node { id, email } }, pageInfo { hasNextPage } } } } }

So wie kann ich/Relais Freunden graphql passieren zählen so wird hasNextPage korrekt erzeugt werden?

Antwort

1

Relay Paginierung ist nicht seitenbasiert, sondern cursor basiert. Sie paginieren also, indem Sie sagen: "Ich will X Gegenstände nach Gegenstand Y". Auf Element Y wird nicht als Seitennummer oder Offset, sondern als Zeiger auf genau dieses Objekt, einen sogenannten Cursor, verwiesen. Dieses Paginierungsmodell eignet sich zum Beispiel für unendliches Scrollen. "Seiten" sind auch nach dem Hinzufügen oder Entfernen von Elementen stabil, da sie nicht von der Anzahl der Elemente abhängen.

hasNextPage in Relay GraphQL spec zeigt nur an, ob nach dem letzten Element, das abgerufen wurde, mehr Elemente vorhanden sind. Also in Ihrem Fall, es bedeutet, dass es mehr als 5 Elemente insgesamt und Sie werden mehr Elemente, wenn man

friends(first: 5, after: "CURSOR_TO_THE_LAST_ELEMENT") 

tun können Sie abrufen Cursor aus der edges Liste, ist es eines der Elemente neben node dort.

1

Hier finden Sie detaillierte Informationen zum Relay-Paginierungsalgorithmus: https://facebook.github.io/relay/graphql/connections.htm#sec-Pagination-algorithm.

Ihre spezielle Frage zu hasNextPage beantworten zu können, ist dies der Algorithmus:

function hasNextPage(allEdges, before, after, first, last) { 

    // If first was not set, return false. 
    if (first === null) { return false; } 

    // Apply the before & after cursor arguments to the set of edges. 
    // i.e. edges is the set of edges between the before and after cursors 
    const edges = ApplyCursorsToEdges(allEdges, before, after) 

    // If more edges exist between the before & after cursors than 
    // you are asking for then there is a next page. 
    if (edges.length > first) { return true; } 
    return false 
} 

Ein kurzer Hinweis auf Cursor vs Seite basiert Paginierung. Es ist im Allgemeinen eine schlechte Idee, mit festen Seitengrößen zu paginieren. Ein klassisches Beispiel hierfür ist die Verwendung des Schlüsselworts OFFSET in SQL, um die nächste Seite zu erfassen. Es gibt viele Probleme mit diesem Ansatz. Was würde zum Beispiel passieren, wenn ein neues Objekt eingefügt wurde, während Sie das Set paginieren? Wenn das neue Objekt vor der Seite eingefügt wurde, die Sie gerade erfassen, und Sie einen festen Abstand verwenden, greifen Sie ein Objekt, das Sie bereits erfasst haben, was zu doppelten Daten in Ihrer Präsentationsebene führt. Die Verwendung von Cursorn für die Paginierung behebt dieses Problem, indem Sie die Objekte selbst verfolgen können, anstatt die Objekte zu zählen.

Einmal letzte Sache mit Relais Paginierung speziell. Ich empfehle nur (vorher & nachher) ODER (zuletzt & vorher) zu jedem gegebenen Zeitpunkt. Die Verwendung beider in derselben Abfrage kann zu logischen, jedoch unerwarteten Ergebnissen führen.

Viel Glück!

Verwandte Themen