Relay/GraphQL 向连接添加自定义字段 [英] Relay/GraphQL add custom field to connection
问题描述
我正在尝试添加用于分页的记录总数.现在我可以看到我在修改它以使我的 totalCount 与它分开时遇到问题的连接.
I am trying to add the totalcount of records to be used for pagination. Right now i can see the connection i am having trouble modifying it to get my totalCount to be apart of it.
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 中获取连接对象时.我希望能够将该值分配给一个字段.
When i get the connection object in the BookConnection in this case. I want to be able to assign that value to a field.
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 can I make totalCount
a property of the connection
variable?
我在这里找到了部分答案:如何将总计数传递给 pageInfo 中的客户端
I found part of the answer here: How to pass total count to the client in pageInfo
推荐答案
在看了一个小时左右后,这一点非常明显.我不知道如何从 connectionFromArray()
接收 totalCount 值,这就是我覆盖它的方式.
This was very obvious after starring at this for a hour or so . I couldn't figure out how to receive the totalCount value from connectionFromArray()
This is how i overwrote it.
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 的目的是什么?
Above is the graphql-relay lib that has this function. What is the purpose of not passing us arrayLength when they obviously have it to perform there paging?
这篇关于Relay/GraphQL 向连接添加自定义字段的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!