2012-03-01 35 views
32

Có sự kiện chung nào kích hoạt mỗi lần chúng tôi điều hướng đến một URL khác không?Lịch sử Backbone.js 'trên sự kiện thay đổi tuyến đường'?

window.App = 
    Models: {} 
    Collections: {} 
    Views: {} 
    Routers: {} 

    init: -> 
    # Initialize Routers 
    new App.Routers.Main() 

    # Initialize History 
    Backbone.history.start(pushState: true) 

    # BIND VIEW CHANGE? 
    $(@).on 'changeOfRoute', -> 
     console.log "Different Page" 

$(document).ready -> 
    App.init() 

Làm điều này cho mỗi lượt xem là có thể, nhưng tôi đang tìm một giải pháp chung.

Trả lời

46

Có một "lộ trình" sự kiện trên Router:

http://backbonejs.org/#Events-catalog

  • "lộ trình" (router, tuyến đường, params) - Bị sa thải bởi lịch sử (hoặc router) khi bất kỳ tuyến đường có đã được so khớp.

Điều này cho phép bạn liên kết với các tuyến đường cụ thể.

Nếu bạn muốn bắn một handler sau bất kỳ tuyến đường, liên kết với "lộ trình", và con đường sẽ là đối số đầu tiên:

myRouter.on("route", function(route, params) { 
    console.log("Different Page: " + route); 
}); 

này sẽ chỉ kích hoạt sự kiện cho các tuyến đường được xác định một cách rõ ràng của bạn. Nếu bạn muốn kích hoạt sự kiện cho các tuyến đường không được xác định rõ ràng, sau đó thêm tuyến đường 'splat' theo How to detect invalid route and trigger function in Backbone.Controller

+2

Cảm ơn, công trình này. Tuy nhiên, sự kiện cháy sau khi tuyến đường đã thay đổi. Có sự kiện nào xảy ra nếu thay đổi tuyến đường được bắt đầu không? – TTT

+0

Không phải là tôi biết. –

+2

Dường như bản phát hành 1.1.x có Router.execute, nó kích hoạt _before_ mỗi tuyến. http://backbonejs.org/#Router-execute – zedd45

0

@TTT: Thật không may Backbone không cung cấp cho chúng tôi sự kiện trước/sau, vì vậy bạn sẽ cần phải ghi đè hoặc mở rộng Router.route. Bạn có thể tìm ra cách để làm điều đó trong câu trả lời này: https://stackoverflow.com/a/16298966/2330244

2

Từ the Backbone docs

Phương pháp này được gọi trong nội bộ các bộ định tuyến, bất cứ khi nào một phù hợp tuyến đường và gọi lại tương ứng của nó sắp được thực hiện. Ghi đè lên nó để thực hiện phân tích cú pháp tùy chỉnh hoặc gói của các tuyến đường của bạn, ví dụ, để phân tích các chuỗi truy vấn trước khi trao cho họ để gọi lại tuyến đường của bạn, như vậy:

var Router = Backbone.Router.extend({ 
    execute: function(callback, args) { 
    args.push(parseQueryString(args.pop())); 
    if (callback) callback.apply(this, args); 
    } 
}); 

This site có một số mã hữu ích cho việc xác định lại Router để hỗ trợ 'trước 'và' sau 'móc, mặc dù nó sẽ yêu cầu cập nhật với mỗi phiên bản thay đổi của xương sống.

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