2014-12-16 24 views
25

Tôi cóbiến toàn cầu trong Meteor

var Schemas = {}; 

Meteor.isClient && Template.registerHelper("Schemas", Schemas); 

Schemas.Person = new SimpleSchema({ 
    fullName: { 
    type: String, 
    index: 1, 
    optional: true, 
    }, 
    email: { 
    type: String, 
    optional: true 
    }, 
    address: { 
    type: String, 
    optional: true 
    }, 
    isActive: { 
    type: Boolean, 
    }, 
    age: { 
    type: Number, 
    optional: true 
    } 
}); 

trong một tập tin và

var Collections = {}; 

Meteor.isClient && Template.registerHelper("Collections", Collections); 

Persons = Collections.Persons = new Mongo.Collection("Persons"); 
Persons.attachSchema(Schemas.Person); 

trong tập tin khác.

Tôi gặp lỗi ReferenceError: Schemas is not defined. Rõ ràng là tôi phải xác định Schemas trong tệp collections.js của mình thay vì đặt chúng riêng biệt. Nhưng làm sao Meteor làm việc với mã trong các tệp riêng biệt? Tôi có thể truy cập một số đối tượng và các biến trong khi những người khác không thể truy cập được.

+0

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ì –

+3

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) –

Trả lời

53

Khi bạn định nghĩa một biến trong cách hoạt Javascript cổ điển:

var someVar = 'someValue'; 

tại thư mục gốc của tập tin .js bạn Meteor phạm vi nó vào tập tin sử dụng một IIFE.

Nếu bạn muốn xác định một biến toàn cầu, đơn giản là không viết var, cho:

someVar = 'someValue'; 

này sẽ xác định một biến trong tất cả các ứng dụng của bạn theo mặc định, mặc dù bạn có thể hạn chế nó bằng cách viết rằng khai báo trong một ví dụ: specific recognized folder (client hoặc server thư mục).

Tuy nhiên biến này sẽ không được xác định hoàn toàn trước tiên. Nó sẽ được định nghĩa khi Meteor chạy mã thực sự định nghĩa nó. Vì vậy, nó có thể không phải là thực hành tốt nhất bởi vì bạn sẽ đấu tranh với thứ tự tải, và nó sẽ làm cho mã của bạn phụ thuộc vào cách Meteor loads files: thư mục nào bạn đưa tệp vào, tên của tệp ... Mã của bạn là dễ bị lỗi lầm nếu bạn chạm nhẹ vào kiến ​​trúc của mình.

Như tôi đã đề xuất trong another closely related post bạn nên đi mua trực tiếp!

+0

Tôi cố gắng xác định các biến toàn cầu của mình trong thư mục lib nhưng các gói chắc chắn mạnh mẽ hơn – CleoR

+3

I Tôi muốn thêm rằng điều này thực sự tuyệt vời vì bạn có thể có một tệp constants.js trong/client của bạn và một tệp khác trong thư mục/server của bạn. Và nếu bạn muốn chia sẻ một tập tin hằng số giữa cả hai, bạn có thể tạo nó trong/lib/hằng số. –

+0

Đây không phải là vấn đề Meteor. Xem dưới đây để tham khảoError. –

11

Biến trong Meteor khai báo với từ khóa var được scoped đến tập tin họ được khai báo trong.

Nếu bạn muốn tạo một biến toàn cầu làm điều này

Schemas = {} 
+3

Tôi không chắc mình cảm thấy thế nào về điều này ... không có cách nào để nhập các biến từ tệp khác vào ES6/webpack để tôi có thể tránh các hình ảnh chung? – Andy

2

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.

+0

Lưu ý rằng đoạn mã thứ ba phải được thêm vào đầu mỗi tệp cần sử dụng biến toàn cầu, cho mỗi biến để sử dụng. –

+1

Bạn có thể giải thích lý do tại sao bạn gọi ES6 và điều này có liên quan đến câu hỏi này không? – Fletch

+0

@Fletch umm ... thực sự là không. Vì vậy, tôi đã xóa nó. Vì lý do nào đó, tôi nghĩ các mô-đun ES6 sẽ giúp dọn sạch không gian tên toàn cục, nhưng tôi không thể tìm thấy bất cứ điều gì về nó: - / –

0

Biến phiên là toàn cầu và có thể được truy cập trong các tệp/hàm khác nhau một cách dễ dàng. Session.setPersistent được sử dụng để đặt tên biến liên tục trên tất cả các tệp. Người ta có thể hạn chế sử dụng các biến phiên khi ứng dụng của họ quá lớn vì chúng không bị xóa và có thể gây ra lỗi trong bảng điều khiển. Liên kết tới tài liệu: https://docs.meteor.com/api/session.html