8

Tôi đang ở trong tình huống sau.Phụ thuộc thông tư cho một ứng dụng web bằng backbone.marionette và requireJs

Tôi đang sử dụng requireJ để tải mô-đun và tôi không muốn sử dụng biến toàn cục.

Main.js chịu trách nhiệm tải bộ định tuyến.
Sau đó, bộ định tuyến tải ứng dụng và ứng dụng tải một số ứng dụng con.

Sau khi mọi thứ đã được khởi tạo, các ứng dụng con cần router để thực hiện router.navigate.

Đây schema:

main.js -> router -> app -> subApp -> router 

Sau đó, tôi có một vấn đề của Thông tư Dependencies và vì lý do đó router trong subApp sẽ không xác định.

Cách tốt nhất để tổ chức lại mã của tôi hoặc khắc phục vấn đề này là gì? Có một số ví dụ về điều này không?

+0

tôi nghĩ requirejs được cho là để xử lý phụ thuộc vòng tròn một cách chính xác ... (tôi thành thật không biết. Tôi không phải là fan của requirejs) –

+0

Không, nó không. Nó không phải là sự kiện cho bạn biết đó là một phụ thuộc vòng tròn - mọi thứ chỉ dừng hoạt động và một số tham chiếu trở thành không xác định. –

Trả lời

5

schema:

main.js -> router -> app -> subApp -> router 

là đúng.

Nếu bạn đang sử dụng backbone.marionette, để truy cập router từ các ứng dụng và subApp, mà không sử dụng global var, bạn nên bắt đầu ứng dụng trong bộ định tuyến theo cách này:


// router.js 
YourApp.start(router: router); 

// app.js 
YourApp.addInitializer(function(options){ 
    // do useful stuff here 
    var myView = new MyView({ 
    router: options.router 
    }); 
    YourApp.mainRegion.show(myView); 
}); 
+1

không nên ứng dụng chỉ chuyển chính nó vào bộ định tuyến? Có vẻ kỳ lạ là router sẽ khởi động ứng dụng. Nếu bạn có nhiều bộ định tuyến thì sao? @AntoJs –

2

Subapp có thể nâng cao sự kiện mà router xử lý chứ không phải là có một sự phụ thuộc rõ ràng trên router

+0

cảm ơn, bạn có thể chuyển tiếp cho tôi một ví dụ không? –

+0

bạn nói subApp có thể tăng sự kiện, nhưng với mô-đun nào? Nếu tôi cố gắng nhập ứng dụng từ subApp, tôi có cùng một vấn đề về Dependencies Circular. –

2

Trong dự án của tôi, tôi sử dụng phụ thuộc sau: main.js -> Ứng dụng -> router -> subApp.

Trong app.js, tôi tạo một biến toàn cầu duy nhất chứa một con trỏ đến ứng dụng của tôi:

define([...], function(...) { 
return { 
    initialize: function() { 
    window.MyApp = new Backbone.Marionette.Application(); 
    // ... 
    MyApp.start(); 
    } 
}; 
}); 

Điều này làm cho nó rất dễ dàng để truy cập vào các khu vực ứng dụng của tôi từ bất cứ nơi nào, cũng như lưu trữ thông tin trạng thái toàn cầu trong một không gian tên.

Tôi đã thử làm điều đó mà không có ứng dụng toàn cầu lúc đầu, nhưng cuối cùng đã bỏ cuộc và thấy phương pháp này linh hoạt hơn nhiều.

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