2016-07-11 6 views
0

Я пытаюсь добавить totalcount записей, которые будут использоваться для разбивки на страницы. Прямо сейчас я вижу связь, у меня возникли проблемы с ее модификацией, чтобы мой totalCount был отделен от нее.Relay/GraphQL добавить настраиваемое поле к соединению

Books: { 
     type: BooksConnection.connectionType, 
     args: { ...connectionArgs, isbn: { type: GraphQLString }, publisher: {type: GraphQLString}}, 
     resolve: (obj, { ...args }, context, { rootValue: objectManager }) => 
     { 
      let user = obj; 
      let FormatedArgs = MasterFields.FormatPredicate(args); 
      return objectManager.getListBy('Book', user, FormatedArgs.queryArgs, objectManager.getViewerUserId()).then((arr) => 
      { 

       let result = {}; 
       result.Books = arr; 
       result.totalCount = arr.length; 
; 
       //Originally i would just pass arr instead of result. 
       return connectionFromArray(result, FormatedArgs.connArgs); 
      }) 
     } 
    }, 

Когда я получаю объект соединения в BookConnection в этом случае. Я хочу иметь возможность присвоить это значение полю.

export default connectionDefinitions({ 
    name: 'Books', 
    nodeType: BookType, 
    connectionFields:() => ({ 
     totalCount: { 
      type: GraphQLInt, 
      resolve: (connection) => { console.log(connection); return connection.totalCount; }, 
      description: `A count of the total number of objects in this connection, ignoring pagination. 
This allows a client to fetch the first five objects by passing "5" as the 
argument to "first", then fetch the total count so it could display "5 of 83", 
for example.` 
     } 
}) 
}); 

Как я могу сделать totalCount свойство переменной connection?

Я нашел часть ответа здесь: How to pass total count to the client in pageInfo

ответ

0

Это было совершенно очевидно, после главной роли в этом в течение часа или около того. Я не мог понять, как получить значение totalCount от connectionFromArray() Вот как я его перезаписал.

Books: { 
     type: BooksConnection.connectionType, 
     args: { ...connectionArgs, isbn: { type: GraphQLString }, publisher: {type: GraphQLString}}, 
     resolve: (obj, { ...args }, context, { rootValue: objectManager }) => 
     { 
      let user = obj; 
      let FormatedArgs = MasterFields.FormatPredicate(args); 
      return objectManager.getListBy('Book', user, FormatedArgs.queryArgs, objectManager.getViewerUserId()).then((arr) => 
      { 

       let result = connectionFromArray(arr, FormatedArgs.connArgs); 
; 
       result.pageInfo.totalCount = arr.length; 


       return result; 
      }) 
     } 
    }, 

Теперь это я жалуюсь.

function connectionFromArray(data, args) { 
    return connectionFromArraySlice(data, args, { 
    sliceStart: 0, 
    arrayLength: data.length 
    }); 
} 
function connectionFromArraySlice(arraySlice, args, meta) { 
    var after = args.after; 
    var before = args.before; 
    var first = args.first; 
    var last = args.last; 
    var sliceStart = meta.sliceStart; 
    var arrayLength = meta.arrayLength; 

    var sliceEnd = sliceStart + arraySlice.length; 
    var beforeOffset = getOffsetWithDefault(before, arrayLength); 
    var afterOffset = getOffsetWithDefault(after, -1); 

    var startOffset = Math.max(sliceStart - 1, afterOffset, -1) + 1; 
    var endOffset = Math.min(sliceEnd, beforeOffset, arrayLength); 
    if (typeof first === 'number') { 
    endOffset = Math.min(endOffset, startOffset + first); 
    } 
    if (typeof last === 'number') { 
    startOffset = Math.max(startOffset, endOffset - last); 
    } 

    // If supplied slice is too large, trim it down before mapping over it. 
    var slice = arraySlice.slice(Math.max(startOffset - sliceStart, 0), arraySlice.length - (sliceEnd - endOffset)); 

    var edges = slice.map(function (value, index) { 
    return { 
     cursor: offsetToCursor(startOffset + index), 
     node: value 
    }; 
    }); 

Выше приведено описание библиотеки graphql-relay, которая имеет эту функцию. Какова цель не передавать нам arrayLength, когда они, очевидно, имеют ее для выполнения поискового вызова?