2012-12-19 32 views
7

Đây là tệp app.js của tôi. Tôi cần truy cập phương thức navigate của bộ định tuyến từ trong phương thức navigateToLogin của lớp LandingView. Nhưng kể từ khi appRouter được định nghĩa sau khi xem nó không thể nhận ra router từ bên trong khung nhìn. Vì vậy, tôi cần phải tìm một cách để truy cập toàn cầu router từ bất kỳ lớp hoặc phương pháp nào. Làm thế nào tôi có thể giải quyết vấn đề này?Làm cách nào để truy cập bộ định tuyến toàn cầu trong js đường trục?

var LandingView = Backbone.View.extend({ 
    tagName: 'div', 
    id: 'landing', 
    className: 'landingpad', 
    events: { 
     'click button#login': 'navigateToLogin', 
    }, 
    render: function(){ 

     (this.$el).append("<button class='button' id='login'>Login</button><br/><br/><br/>"); 
     (this.$el).append("<button class='button' id='new'>New User?</button>"); 

     console.log(this.el); 
     return this; 
    }, 
    navigateToLogin: function(e){ 
     app.navigate("/login", true); 
     return false; 
    }, 
}); 

var appRouter = Backbone.Router.extend({ 

initialize: function(){ 
    $('#content').html(new LandingView().render().el); 
} 
}); 

    app = new appRouter(); 
+0

Câu trả lời của Lukas phải là câu trả lời được chấp nhận cho câu hỏi này. –

Trả lời

20

Nếu bạn đào vào mã Backbone của một chút, bạn sẽ nhận thấy rằng việc thực hiện của router của navigate lần lượt gọi Backbone.history.navigate:

// Simple proxy to `Backbone.history` to save a fragment into the history. 
navigate: function(fragment, options) { 
    Backbone.history.navigate(fragment, options); 
} 

Vì vậy, thay vì mucking một cách rõ ràng lên phạm vi toàn cầu, sử dụng Backbone.history.navigate:

var LandingView = Backbone.View.extend({ 
    ... 
    navigateToLogin: function(e){ 
     Backbone.history.navigate("/login", true); 
     return false; 
    }, 
}); 
+0

Tôi đã giải quyết được vấn đề điều hướng. Tôi bỏ qua các dấu gạch chéo trong các chức năng điều hướng và nó đã làm việc :) Nhưng cảm ơn cho thông tin. Thật thú vị khi biết rằng luôn luôn có nhiều cách để giải quyết vấn đề :) – jaykumarark

+0

+1: Đây là một câu trả lời tuyệt vời. Cảm ơn rất nhiều! –

+0

Đây phải là câu trả lời được chấp nhận. –

7

Nếu bạn cần appRouter để có thể truy cập trên toàn cầu, bạn phải đính kèm nó vào một số đối tượng toàn cầu. Trong trình duyệt web, đây là đối tượng window.

window.app = new appRouter(); 

Và truy cập nó qua cửa sổ:

window.app.navigate(...); 

Sử dụng globals có thể dẫn đến mã đó là khó khăn để duy trì. Nếu ứng dụng của bạn không có kích thước nhỏ, hãy xem xét sử dụng một số cơ chế tách, chẳng hạn như mediator pattern.

+0

Tôi đang làm một ứng dụng nhỏ khá dễ quản lý và hoàn toàn dành cho mục đích giáo dục. Nó đã làm việc. Cảm ơn :) – jaykumarark

+0

'\t tuyến: { \t "": "init" \t "/ login": "loadLogin", \t}, ' router của tôi dường như không để kích hoạt chức năng loadLogin của router. Có điều gì sai trái với tuyên bố trên không? – jaykumarark

+0

@jaykumarark không chắc chắn, hãy thử xác định tuyến đường mà không có dấu gạch chéo về phía trước. – jevakallio

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