2012-02-25 31 views
6

Tôi có router sau:Backbone Router không kích hoạt đường

appRouter = Backbone.Router.extend({ 
    routes: { 
    '': 'inbox', 
    'inbox': 'inbox', 
    'discussions_engagement': 'contacts', 
    }, 

    inbox: function(page) { 
    console.log('inbox'); 
    var page = page || 1; 
    engage.app.hydrateInbox(page, engage.app.showInbox); 
    }, 
    .... 
}; 

Khi tôi đang trên http: // [...]/# hộp thư đến và tôi gọi

appRouter.navigate('inbox', {trigger: true}); 

hành động hộp thư đến không cháy cái mà tôi muốn đạt được. Bây giờ tôi đã xem xét nguồn gốc của Backbone (https://github.com/documentcloud/backbone/blob/master/backbone.js#L1027) và tôi thấy rằng nó không hỗ trợ những gì tôi đang cố gắng làm nhưng có một số cách để hoàn thành điều này?

+1

Không phải là câu trả lời cho câu hỏi của bạn, nhưng có thể là giải pháp (nếu tôi đưa bạn chính xác): (Re-) Hiển thị trang của bạn/chế độ xem cha mẹ của bạn, ví dụ: 'appView.render()'. – SunnyRed

Trả lời

4

tôi sẽ tạo ra một người quản lý sự kiện trong đối tượng engage.app của bạn, như thế này:

var vent = _.extend({}, Backbone.Events); 

Sau đó, trong router của bạn làm việc này cho các tuyến đường hộp thư đến:

vent.trigger('inbox:show', page); 

Và xử lý sự kiện trong đối tượng engage.app, làm mã ở đó đã từng có trong trình xử lý tuyến đường.

Bây giờ, thay vì gọi số appRouter.navigate bạn có thể kích hoạt sự kiện tương tự.

Ngoài ra, từ trình xử lý đó, bạn có thể gọi appRouter.navigate('inbox'); mà không chuyển đúng sự thật. Giờ đây, bạn có thể đưa ứng dụng của mình đến trạng thái bạn muốn mà không cần cố gắng thực hiện tuyến đường.

+0

Đó là những gì tôi đã làm; có vẻ như một giải pháp nửa phong nha mặc dù nó tạo ra một số mã bổ sung. –

+0

@JasonStonebraker [Liên kết này] (http://lostechies.com/derickbailey/2011/08/28/dont-execute-a-backbone-js-route-handler-from-your-code/) giải thích ý tưởng. Mô hình này đã làm việc tốt cho tôi. Nó rời khỏi bộ định tuyến với một công việc duy nhất, đó là định tuyến dựa trên các thay đổi URL trình duyệt. Câu hỏi này là về việc cố kích hoạt tuyến đường khi bạn đã ở trên tuyến đường đó. Giải pháp này không phải là một giải pháp (IMO) mà là một thiết kế tốt hơn. –

-1

lựa chọn khác là chỉ để gọi phương thức

appRouter.inbox(); 
2

Theo như tôi có thể nói ... Tính đến Backbone 0.9.10 sử dụng appRouter.navigate('inbox', {trigger: true}); công trình như mong đợi.

+0

Nguồn Backbone vẫn có: 'if (this.fragment === fragment) return;', vì vậy tôi nghĩ rằng vấn đề của Gavin vẫn tồn tại. Ngoài ra, nguồn có một chú thích: 'Đối tượng tùy chọn có thể chứa 'trigger: true' nếu bạn muốn có callback route được kích hoạt (không thường là mong muốn)'. –

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