2011-12-07 27 views
8

Sử dụng Backbone.js, có thể làm cho bộ định tuyến điều hướng đến trang mà nó đến từ đâu không? Tôi muốn sử dụng điều đó cho trường hợp tôi thay đổi URL của mình khi cửa sổ bật lên xuất hiện và tôi muốn thay đổi lại khi tôi ẩn cửa sổ bật lên. Tôi không muốn đơn giản quay trở lại, vì tôi muốn giữ trang nền ở chính xác vị trí giống như tôi đã để nó trước khi tôi hiển thị cửa sổ bật lênChuyển im lặng thành url trước bằng cách sử dụng Backbone.js

Trả lời

14

Bạn có thể giải quyết vấn đề này bằng cách mở rộng Backbone.Router và lưu trữ tất cả các tuyến đường trong khi điều hướng.

class MyRouter extends Backbone.Router 
    constructor: (options) -> 
    @on "all", @storeRoute 
    @history = [] 
    super options 

    storeRoute: -> 
    @history.push Backbone.history.fragment 

    previous: -> 
    if @history.length > 1 
     @navigate @history[@history.length-2], true 

Sau đó, khi bạn phải bỏ phương thức của bạn, chỉ cần gọi MyRouter.previous() phương pháp mà nó sẽ chuyển hướng bạn trở lại "băm" cuối cùng.

+3

thực sự bạn chỉ có thể lưu trữ "băm" cuối cùng thay vì lịch sử lỗ – mateusmaso

+0

Cảm ơn! Chính xác những gì tôi đang tìm kiếm. – Felipe

+0

Tôi không tin rằng điều này sẽ đảm bảo rằng phương pháp storeRoute sẽ luôn được gọi trước một phương thức định tuyến có thể sử dụng nó. Kết quả là, những gì được lưu trữ trong lịch sử sẽ không nhất quán. – DrewB

-2

Bạn có thể kích hoạt tuyến đường trong onCloseEvent của cửa sổ bật lên hoặc lớp phủ của bạn :

router.navigate('/lasturl/'); 

Điều này sẽ đặt url. Nếu bạn vượt qua true như param thứ hai, bạn cũng sẽ thực hiện hành động route. Nếu không, trang sẽ được giữ nguyên.

http://documentcloud.github.com/backbone/#Router-navigate

+8

Tất nhiên, nhưng một lần nữa câu hỏi là, làm cách nào để biết url cuối cùng là gì? Backbone có cung cấp một phương thức hữu ích hay tôi sẽ phải lấy nó từ window.history? – user802232

1

Tôi nghĩ rằng câu trả lời của mateusmaso chủ yếu là đúng nhưng yêu cầu một số chỉnh sửa để bảo đảm rằng bạn luôn nhận đúng URL bạn đang tìm kiếm.

Trước tiên, bạn cần phải ghi đè phương pháp lộ trình để có một phương pháp beforeRoute lửa:

route: (route, name, callback) => 
    Backbone.Router.prototype.route.call(this, route, name, => 
    @trigger('beforeRoute') 
    callback.apply(this, arguments) 
    ) 

Sau đó, bạn gắn kết sự kiện này và khởi tạo các biến dụ lịch sử:

initialize: (options) ->  
    @history = [] 
    @on "beforeRoute", @storeRoute 

Tiếp theo, tạo phương pháp helper cho lưu trữ và truy xuất phân đoạn:

storeRoute: => 
    @history.push Backbone.history.fragment 

previousFragment: => 
    @history[@history.length-2] 

Cuối cùng, bạn cần một phương thức trợ giúp cuối cùng có thể được sử dụng để thay đổi URL mà không cần tải lại và lưu trữ đoạn kết quả. Bạn cần sử dụng điều này khi đóng cửa sổ bật lên hoặc bạn sẽ không có đoạn mong đợi trong lịch sử của mình nếu người dùng nhận được cửa sổ bật lên một lần nữa mà không cần điều hướng đến bất kỳ nơi nào khác. Điều này là do việc điều hướng gọi mà không có "trigger: true" sẽ không kích hoạt trình xử lý sự kiện để lưu trữ đoạn.

changeAndStoreFragment: (fragment) => 
    @navigate(fragment) 
    @storeRoute() 
0

Câu trả lời này có thể không giải quyết được câu hỏi, nhưng đó cũng chính là vấn đề tương tự. Tôi không thể điều hướng âm thầm đến tuyến đường trước đó hoặc tuyến đường tùy chỉnh do dấu gạch chéo. Để các hàm tuyến đường KHÔNG được kích hoạt, hãy sử dụng {trigger:false} hoặc không sử dụng trình kích hoạt nào vì false là hành vi mặc định và đảm bảo tuyến đường của bạn bắt đầu bằng #something thay vì '#/something' (chú ý dấu gạch chéo) hoặc thay đổi regEx bên trong Backbone.js, phần bộ định tuyến.

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