Relay / GraphQL добавить настраиваемое поле для подключения

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

    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?

Я нашел здесь часть ответа: Как передать общую посчитать клиенту в pageInfo


person jackncoke    schedule 11.07.2016    source источник


Ответы (1)


Это было очень очевидно после того, как я снялся в этом в течение часа или около того. Я не мог понять, как получить значение 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, когда они, очевидно, имеют его для выполнения там разбиения по страницам?

person jackncoke    schedule 11.07.2016