2010-02-25 14 views
10

Tôi có một trang được gọi là Đơn đặt hàng và một trang có tên là OrderDetails. Như được mô tả trong tuyệt vời MVP tutorial Tôi đang làm việc với Lịch sử (với một ValueChangeListener trung tâm) và một "event bus" HandlerManager.Sử dụng Lịch sử GWT để chuyển các tham số?

Tôi có một trình xử lý đã đăng ký cho sự kiện ai đó nhấp vào đơn đặt hàng, về cơ bản tạo OrderDetailPresenter, chuyển vào ID đơn đặt hàng (được chứa trong ShowOrderDetailEvent) và sau đó gọi History.newItem("orderDetails").

Điều này có một vài nhược điểm chính: Bước Lịch sử mới được tạo này KHÔNG biết ID đơn đặt hàng nào được chuyển vào. Ví dụ: nếu ai đó đánh dấu trang chi tiết đơn đặt hàng (hoặc quay lại sau trong trình duyệt của họ), họ ' sẽ nhận được một trang trống không có chi tiết đơn đặt hàng.

Vì vậy, câu hỏi của tôi là: Thay vào đó, tôi có nên làm điều gì đó như History.newItem("orderDetails?id="+id) và sau đó phân tích cú pháp lịch sử trong trình xử lý thay đổi giá trị của mình không? Nếu vậy, có một thực hành tốt nhất, một API, hoặc thư viện để phân tích cú pháp và định dạng đối số thành một chuỗi theo cách này?

Trả lời

9

Vâng, đó là những gì bạn nên làm. Có, cho đến nay như tôi biết, không có thư viện để làm điều này dễ dàng hơn.

Một chút lời khuyên: nếu có thể, bạn nên tránh sử dụng lược đồ yêu cầu bạn sử dụng phần trăm thoát trong chuỗi mục lịch sử của bạn. Lý do là những gì location.hash trả về khi location.href kết thúc bằng, giả sử #%[email protected]%40 thay đổi từ trình duyệt đến trình duyệt. Ví dụ: Chrome trả về #%[email protected]%40; Firefox trả về #<@@. Thiết lập location.hash có thể có các hiệu ứng tương tự như trình duyệt cụ thể.

Cơ chế mã thông báo lịch sử của GWT dựa trên location.hash và không bình thường hóa sự khác biệt này trong hành vi của trình duyệt. Kết quả cuối cùng là nếu bạn sử dụng thứ gì đó yêu cầu phần trăm thoát, bạn sẽ nhận được các url không thể chia sẻ giữa các trình duyệt - đây là vấn đề nếu trên một số trang khác bạn muốn tạo liên kết chuyển đến một vị trí cụ thể trong GWT của bạn hoặc nếu bạn mong đợi người dùng chia sẻ URL liên kết đến trong ứng dụng GWT của bạn. (hoặc khi người dùng của bạn cài đặt Chrome, hãy nhập dấu trang của họ từ Firefox chỉ vào các vị trí cụ thể trong ứng dụng web của bạn và đột nhiên dấu trang không hoạt động như trước đây)

Vì hoang tưởng, tôi tránh đặt bất kỳ ?, #, &, %, < hoặc > ký tự trong chuỗi mã thông báo lịch sử của bạn. Tuy nhiên, các chuỗi như orderDetails/oid=12313378 sẽ ổn và trình duyệt chéo.

(Edited để làm rõ rằng vấn đề tôi đang nói về là đối phó với việc có URL giống hệt nhau làm việc trong nhiều trình duyệt khác nhau, không phải vì có lịch sử làm việc phương pháp thẻ ở tất cả trong mỗi trình duyệt khác nhau)

+0

Trên thực tế GWT DOES đưa vào tài khoản sự khác biệt trong các trình duyệt. Nó thậm chí hoạt động xung quanh một số vấn đề khác nhau không được đề cập ở đây. Vì vậy, bạn có thể sử dụng bất kỳ nhân vật được đề cập. Nếu bạn muốn kiểm tra điều này, chỉ cần xem các lớp 'com.google.gwt.user.client.impl.HistoryImpl ' trong tệp 'gwt-user.jar' (gwt 2.0). Và nó cũng thực hiện de/encoding để bạn có thể truyền vào '@' và nó sẽ xử lý nó. –

+0

Âm thanh tuyệt vời. Tôi đã nhận thấy rằng GMail thực hiện chính xác điều này là tốt, nếu tôi nhấp vào một nhãn ví dụ, sau đó URL thay đổi thành "... # inbox/labelname". Tuy nhiên, URL của họ mã hóa tên nhãn nên tôi cũng làm như vậy với URL.encode và URL.decode. – Epaga

+0

Chỉ cần hoàn thành. Nếu bạn sử dụng 'History.newItem (..)', bạn không nên giải mã/mã hóa, bởi vì GWT đã làm điều này cho bạn. Trong thực tế, nếu bạn làm điều đó, nó có thể dẫn đến các vấn đề được đề cập về Firefox. –