2012-08-07 11 views
5

Tôi đang cố triển khai chức năng tìm kiếm cho trang web của mình. Khi người dùng nhập cụm từ tìm kiếm foobar vào hộp input và gửi nó, anh ta được chuyển hướng đến http://mydomain.com/search?query=foobar.Backbone.js có nên lấy các tham số GET từ URL không?

Sự cố :: Tôi nên lấy tham số GET query từ URL và gửi nó tới phần phụ trợ và nhận một mảng kết quả như phản hồi JSON như thế nào? Tôi có nên làm theo cách này không?

Nỗ lực hiện tại của tôi dưới đây thậm chí không làm cho chức năng search được kích hoạt.

Router

var AppRouter = Backbone.Router.extend({ 
    routes: { 
     'search?query=:query': 'search' 
     // ... and some other routes 
    }, 

    search: function(query) { 
     this.photoList = new SearchCollection(); 
     var self = this; 
     this.photoList.fetch({ 
      data: {query: query}, 
      success: function() { 
       self.photoListView = new PhotoListView({ collection: self.photoList }); 
       self.photoListView.render(); 
      } 
     }); 
    } 

}); 

var app = new AppRouter(); 
Backbone.history.start({ 
    pushState: true, 
    root: '/' 
}); 

Trả lời

5

Đã có một số vấn đề đệ trình chống lại Backbone cho vấn đề này rất. Có một plugin hiện có hoạt động tốt cho việc này:

https://github.com/jhudson8/backbone-query-parameters

Ngoài ra, tôi hiện đang sử dụng các thông số chuỗi truy vấn trong một API giả phù hợp với phù hợp với lộ trình Backbone của. Trông giống như sau

Route

"/api/v2/application/:query"

Query

application: function(query) { 
    var params = $.deparam(query.slice(1)); 
    // params.something... 
} 

Đối với vấn đề thực tế của bạn trong tầm tay làm thế nào bạn chuyển hướng đến index.html để hỗ trợ pushState?

+0

Người dùng có thể đi cho 'domain.com',' domain.com/something', 'domain.com/search' và router sẽ chạy chức năng chính xác để làm cho các yếu tố trên trang. Tương tác với các liên kết/nút/tab trên trang sẽ 'app.navigate()' đến một phân đoạn URI khác. Điều này có trả lời câu hỏi khi chuyển hướng đến 'index.html' để hỗ trợ' pushState' không? – Nyxynyx

+0

Không, không. Tôi muốn biết làm thế nào bạn đang thiết lập máy chủ của bạn cho pushState, nó không tự động. Bạn cần phải định cấu hình máy chủ web của mình để xử lý các 404 khác để chuyển hướng trở lại index.html. – tbranyen

+0

Tôi có một bộ định tuyến trong khuôn khổ PHP của mình để kiểm tra xem tuyến đường có hợp lệ hay không trước khi hiển thị trang chứa backbone.js. Nếu URL không hợp lệ, bộ định tuyến PHP sẽ chuyển hướng đến 404. – Nyxynyx

-1

Có rất ít trường hợp khi bạn cần đọc URL và trích xuất tham số GET. Tôi nghĩ rằng bạn đang làm điều sai trái và đây là các tùy chọn của tôi:

1) nếu bạn chỉ có một trang trong ứng dụng của mình (trang ứng dụng đơn), bạn có thể hiển thị kết quả khi họ nhập vào trường input hoặc sau khi nhấn submit

2) nếu bạn đang chuyển hướng người dùng đến một trang khác có nghĩa là bạn có thể bootstrap data để sau khi trang web được tải backbone chỉ sẽ phải làm cho kết quả của bạn và chỉ có những yêu cầu khác nếu bạn thay đổi từ tìm kiếm của bạn

3) bạn có thể có biến số javascript được khởi chạy trên tải trang trực tiếp m máy chủ làm việc với các tham số GET có thể dễ dàng hơn

+5

Ngoại trừ không có URL nào cho phép người dùng của ứng dụng chia sẻ trạng thái của họ với người khác. – tbranyen

2

tôi nhấn vấn đề này giống nhau và dự tính sử dụng xương sống-tham số truy vấn, nhưng điều đó cần được xem xét một cách tiếp cận thường không chính xác.

Chuỗi truy vấn url không có nghĩa là giao diện người dùng. Chúng được gửi đến máy chủ và buộc làm mới khi điều hướng từ page.html đến page.html? Something = something.

Bạn nên sử dụng các đoạn băm thay thế. tức là http://www.example.com/ajax.html#key1=value1&key2=value2, sau đó chỉ nhận các giá trị đó theo cách đường trục bình thường và xây dựng các thông số yêu cầu của bạn từ đó.

Xem https://github.com/jashkenas/backbone/issues/891, https://developers.google.com/webmasters/ajax-crawling/docs/specification, http://tools.ietf.org/html/rfc3986#section-3.5