2015-09-13 16 views
9

doesnt làm việc này vì kiểu đề cập đến tự của nó trong định nghĩa lĩnh vực các tuyến đường:Làm cách nào để tôi tạo một giản đồ graphql để tự phân cấp dữ liệu tham chiếu?

var routeType = new GraphQLObjectType({ 
    name: 'MessageRoute', 
    fields: { 
    name: { 
     type: GraphQLString 
    }, 
    routes: { 
     type: new GraphQLList(routeType), 
     resolve: (route) => { 
     return route.routes; 
     } 
    } 
    } 
}); 

vậy làm thế nào để tôi làm điều đó?

Trả lời

13

Loại GraphQL có thể tham chiếu đến chính nó (hoặc tham chiếu đến loại khác được xác định sau trong tệp) bằng cách xác định fields làm hàm trả về đối tượng thay vì đối tượng. Hàm sẽ được gọi sau khi trang đã được phân tích cú pháp đầy đủ.

Ví dụ của bạn:

var routeType = new GraphQLObjectType({ 
    name: 'MessageRoute', 
    fields: function() { 
    return { 
     name: { 
     type: GraphQLString 
     }, 
     routes: { 
     type: new GraphQLList(routeType), 
     resolve: (route) => { 
      return route.routes; 
     } 
     } 
    }; 
    } 
}); 

Hoặc, nếu bạn đang sử dụng ES6, một cách viết tắt tốt đẹp cho này sử dụng chức năng mũi tên:

var routeType = new GraphQLObjectType({ 
    name: 'MessageRoute', 
    fields:() => ({ 
    name: { 
     type: GraphQLString 
    }, 
    routes: { 
     type: new GraphQLList(routeType), 
     resolve: (route) => { 
     return route.routes; 
     } 
    } 
    }) 
}); 
+0

mát nhờ, bất kỳ ý tưởng làm thế nào tôi viết phản ứng phụ của điều mà không nhận được một ngăn xếp tràn? – SammoSampson

1

tôi muốn chỉ ra rằng bạn có thể sử dụng một hàm cho bất kỳ thuộc tính nào bên trong một đối tượng sử dụng Javascript getter.

Vì vậy, thay vì gói toàn bộ tài sản fields trong vòng một chức năng bạn có thể dùng chức năng chỉ dành riêng cho các type bất động sản như thế này:

var routeType = new GraphQLObjectType({ 
    name: 'MessageRoute', 
    fields: { 
    name: { 
     type: GraphQLString 
    }, 
    routes: { 
     get type() { 
     return new GraphQLList(routeType) 
     }, 
     resolve: (route) => { 
     return route.routes; 
     } 
    } 
    } 
}); 
Các vấn đề liên quan