ReferenceError là một lỗi Node. Meteor là một framework trên đỉnh của Node.
Nút có phạm vi toàn cầu (còn gọi là biến số global
của Node). Lỗi này được ném bởi Node (không phải Meteor) nếu bạn cố gắng truy cập một biến toàn cầu không xác định.
Trình duyệt cũng có phạm vi toàn cầu được gọi là window
và không ném Tham chiếu khi các biến không xác định được truy cập.
Dưới đây là một mô hình tôi thích cho thêm chức năng cho một lớp (nó rất Meteor):
/lib/Helpers.js <-- Helpers for everyone (node+browser)
/server/Helpers.js <-- Server helpers (node)
/client/Helpers.js <-- Client helpers (browser)
Hãy xem xét những hiện thực:
// /lib/Helpers.js
Helpers = {/* functions */}; // Assigned to window.Helpers and global.Helpers
// /server/Helpers.js
Helpers = _.extend(Helpers, {/*more functions*/}
// /client/Helpers.js
Helpers = _.extend(Helpers, {/*more functions*/}
Đây là một ví dụ nhỏ.Nếu tôi không muốn lo lắng về thứ tự tải thì sao? Tại sao không _.extend() trong /lib/Helpers.js?
// /lib/Helpers.js
// Helpers = {/* functions */}; // Overwrites...
Helpers = _.extend(Helpers, {/* functions */}); // ReferenceError
Vì bạn sẽ nhận được tham chiếu từ nút nếu người trợ giúp không được xác định - cụ thể là "Người trợ giúp" được sử dụng làm đối số. (Node biết để chỉ định Helpers là global.Helpers).
Dưới đây là hai cách để "sửa chữa" này:
1) Gán Helpers một cái gì đó
// /lib/Helpers.js
// Helpers = Helpers || {} // would be another ReferenceError
if (typeof Helpers === 'undefined') Helpers = {};
Helpers = _.extend(Helpers, {/* functions */});
2) Sử dụng người giúp đỡ từ toàn cầu
// /lib/Helpers.js
Helpers = _.extend(global.Helpers, {/* functions */}); // works in node, but...
Cả hai mà hút.
1) 's cú pháp là khủng khiếp.
2) hoạt động trong nút, nhưng không có toàn cầu trong trình duyệt. Vì vậy, nó không thành công mục đích của nó.
Vì vậy, tôi đã từ bỏ và quay trở lại để ghi đè nó lần đầu tiên trong lib, và tìm kiếm các lỗi thời gian chạy nếu có gì đó bị ghi đè.
Nếu bạn có cú pháp tiện dụng cho trình duyệt chéo này, hãy bình luận :-) var something = something || {} something.blah = foo;
Đây là một số khác JS shorthand tips.
là biến 'Toàn cầu 'là một biến toàn cầu? bạn tải nó bằng cách sử dụng 'require'? có thể bạn cần hiển thị thêm mã cho chúng tôi vì vì mã được viết nên không có vấn đề gì –
có thể trùng lặp của [Làm cách nào tôi có thể truy cập các hằng số trong tệp lib/constants.js trong Meteor?] (http://stackoverflow.com/ question/26836390/how-can-i-access-hằng số-in-the-lib-hằng-js-file-in-meteor) –