2012-08-01 39 views
36

Có cách nào để truy cập tất cả các mô đun được tải của require.js không?require.js: Truy cập tất cả các mô-đun đã tải

Bối cảnh:
Tôi muốn tự động gọi một chức năng init() của tôi javascript mô-đun sau khi tất cả trong số họ được nạp, xem require.js + backbone.js: How to structure modules that have an initialize function? Without require.js tôi looped qua riêng mô-đun lưu trữ của tôi và gọi mỗi chức năng init().
Bây giờ tôi muốn thực hiện việc này với require.js. Tôi biết rằng việc gọi số my_custom_init_function_favoritecolor_petname_love123 của mọi mô-đun được tải (kể cả thư viện bên ngoài) là nguy hiểm. Tôi hy vọng rằng điều này sẽ gây ra ít rắc rối hơn bằng tay giữ một danh sách của tất cả các mô-đun (và các yêu cầu của các mô-đun này) up-to-date. Quên một mô-đun init() có nhiều khả năng hơn thư viện của bên thứ ba có tên hàm tùy chỉnh của tôi (mặc dù sau này có thể khó gỡ lỗi hơn).

Hoặc có ai có ý tưởng tốt hơn về cách thực hiện điều đó không?

Trả lời

59

Có một đối tượng mà khóa của nó là tên mô-đun và giá trị bao gồm giá trị được trả về từ mô-đun đó.

require.s.contexts._.defined bao gồm tất cả các mô-đun (hoặc define() hoặc require() chẳng hạn như tệp Javascript là điểm bắt đầu của chương trình và được chỉ định sử dụng data-main cho RequireJS).

+4

Sự khác biệt giữa đăng ký và được xác định trên ngữ cảnh là gì? Tôi thấy một đối tượng mới trong ngữ cảnh ._ đối tượng đăng ký sau khi xác định ('Mod', ...), nhưng không phải trên ngữ cảnh ._. Sau khi yêu cầu (['Mod'], ...) gọi tôi thấy mô-đun trên ngữ cảnh ._. – alexK85

11

Chỉ cần hoàn thành một hành vi tương tự trong dự án RequireJS của tôi. require.s.contexts['_'].registry giữ danh sách các mô-đun đã đăng ký.

Tôi đang sử dụng Underscore.js để nhận, lọc và lặp lại danh sách mô-đun. Có thể đoạn mã sau đây sẽ giúp bạn:

var modules_registered = _.keys(require.s.contexts['_'].registry); 
var modules_to_be_initialized = _.filter(modules_registered, function(module_title) { 
    return module_title.indexOf('modules') > -1; 
}); 

_.each(modules_to_be_initialized, function(module_name) { 
    require([module_name], function(current_module) { 
     current_module.init(); 
    }); 
}); 
1

tôi là lười biếng, vì vậy tôi chỉ làm điều này:

var modulesToLoad = Object.keys(require.s.contexts['_'].registry); 
    require(modulesToLoad); 

Dựa trên câu trả lời khác ở đây.

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