2016-07-11 5 views
0

페이지 매김에 사용할 레코드의 총 개수를 추가하려고합니다. 지금 당장 나는 totalCount가 떨어져 있도록 연결을 수정하는 데 문제가있는 연결을 볼 수 있습니다.릴레이/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.` 
     } 
}) 
}); 

가 어떻게 totalCountconnection 변수의 속성 수 ? How to pass total count to the client in pageInfo

답변

0

이는 시간 정도이 주연 후 매우 분명했다 :

나는 여기에 해답의 일부를 발견했다. 나는 connectionFromArray()에서 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 = 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 lib입니다. 우리가 arrayLength를 통과하지 못하게하는 이유는 분명히 페이징을 수행 할 때 무엇입니까?