2015-12-17 20 views
8

Cách triển khai chức năng tìm kiếm bằng chuyển tiếp?chức năng tìm kiếm bằng cách sử dụng rơle

Vì vậy, công việc là

  • dùng điều hướng đến search form.

không được có bất kỳ truy vấn nào (như trong vùng chứa chuyển tiếp) khi khởi tạo chế độ xem.

  • người dùng điền vào giá trị trường và nhấn nút hành động/tìm kiếm.

một truy vấn tiếp sức được gửi đến máy chủ

  • kết quả nhận được từ máy chủ.

trang hiển thị nó và tiếp tục hòa giải kết quả filtered với bộ nhớ cache cục bộ.

Tôi chưa thấy ví dụ về truy vấn đặc biệt nhưng chỉ là một phần của vùng chứa tiếp sức (mà nó giải quyết trước khi khởi tạo thành phần). Vì vậy, làm thế nào để mô hình nó. nó có nên giống như một đột biến không?

+0

Có điều gì đó ngăn bạn chỉ sử dụng các đối số và biến trên kết nối không? Vì vậy, mỗi khi bạn muốn tìm kiếm, cập nhật các biến ban đầu và chuyển tiếp sẽ truy vấn kết quả được lọc. – XuoriG

+0

không có gì ngăn tôi làm theo cách này, nhưng tôi nghĩ nó sẽ gửi yêu cầu ban đầu khi vùng chứa được khởi tạo. Tôi đã suy nghĩ nhiều hơn về việc gửi một yêu cầu chỉ khi người dùng bắt đầu hành động. Sẽ thử đề xuất của bạn và quay lại với bạn. – bsr

Trả lời

13

Nếu tôi hiểu chính xác, bạn không muốn gửi bất kỳ truy vấn nào cho thành phần cho đến khi người dùng nhập một số văn bản tìm kiếm, tại thời điểm đó truy vấn sẽ được gửi. Điều này có thể được thực hiện với ví dụ được đăng bởi @Xuorig, với một bổ sung: sử dụng chỉ thị @include của GraphQL để bỏ qua đoạn cho đến khi một biến được đặt. Dưới đây là ví dụ mở rộng:

export default Relay.createContainer(Search, { 
    initialVariables: { 
    count: 3, 
    query: null, 
    hasQuery: false, // `@include(if: ...)` takes a boolean 
    }, 
    fragments: { 
    viewer:() => Relay.QL` 
     fragment on Viewer { 
     # add `@include` to skip the fragment unless $query/$hasQuery are set 
     items(first: $count, query: $query) @include(if: $hasQuery) { 
      edges { 
      node { 
       ... 
      } 
      } 
     } 
     } 
    `, 
    }, 
}); 

Truy vấn này sẽ bị bỏ qua vì điều kiện bao gồm bị lỗi. Sau đó, thành phần có thể gọi setVariables({query: someQueryText, hasQuery: true}) khi nhập văn bản được thay đổi, tại thời điểm đó, điều kiện @include sẽ trở thành sự thật và truy vấn sẽ được gửi đến máy chủ.

+0

cảm ơn bạn rất nhiều. đó thực sự là những gì tôi muốn – bsr

+0

hi @ joe-savona, có thể là API đã thay đổi gần đây nhưng tôi không thể sử dụng chuỗi với 'if', cung cấp lỗi' Đối số "nếu" kiểu dự kiến ​​"Boolean!" nhưng có: "sdsd". irst: 9) @include (nếu: "sdsd") '. Đã cố gắng như 'tìm kiếm (truy vấn: $ truy vấn, đầu tiên: $ đầu tiên) @include (if: !! $ query)' nhưng điều đó quá sai lầm trong 'Bất ngờ!'.vì vậy, tôi đã kết thúc bằng cách sử dụng một cờ boolean để cho biết liệu '$ query' có rỗng hay không. Có cách nào tôi có thể tránh được biến phụ không? – bsr

+1

Điểm tốt - '@include (if: ...)' chỉ chấp nhận các boolean, vì vậy bạn cần một biến khác nếu '$ query' là một chuỗi. Tôi sẽ cập nhật câu trả lời. –

2

Đây là cách tôi đã thực hiện tìm kiếm đơn giản trong dự án của tôi:

export default Relay.createContainer(Search, { 
    initialVariables: { 
    count: 3, 
    title: null, 
    category: null, 
    }, 
    fragments: { 
    viewer:() => Relay.QL` 
     fragment on Viewer { 
     items(first: $count, title: $title, category: $category) { 
      edges { 
      node { 
       ... 
      } 
      } 
     } 
     } 
    `, 
    }, 
}); 

hình thức tìm kiếm của bạn chỉ đơn giản là có để cập nhật các initialVariables sử dụng this.props.relay.setVariables và rơle sẽ truy vấn dữ liệu mới.

+0

cảm ơn. nhưng nó sẽ không gửi một yêu cầu ban đầu khi container được khởi tạo. Tôi sẽ thử nó. cảm ơn một lần nữa. – bsr

+0

Ồ. Có, nó sẽ gửi một yêu cầu ban đầu sẽ trả về tất cả các kết quả. Là một công việc xung quanh, bạn có thể tự động thêm một vùng chứa có truy vấn mà tôi đã đăng trong câu trả lời khi người dùng tìm kiếm và hiển thị nội dung khác khi không có tìm kiếm. – XuoriG

Các vấn đề liên quan