find
phương thức trả về một con trỏ, không phải đối tượng hay mảng. Để truy cập đối tượng, bạn cần tìm nạp nó từ con trỏ
var skill = Skills.find(Session.get('selected_skill')).fetch()[0];
hoặc lấy trực tiếp bằng findOne
:
var skill = Skills.findOne(Session.get('selected_skill'));
Sau đó, bạn có thể sử dụng nó giống như bất kỳ đối tượng js nào khác:
console.log(skill.mana);
skill._cache = {cooldown: true};
Hãy nhớ rằng ở phía máy khách, các phương pháp thu thập như find
không bị chặn. Chúng trả về bất kỳ thứ gì Meteor có trong bộ nhớ cache, không nhất thiết là những gì có trong db phía máy chủ. Đó là lý do tại sao bạn nên luôn sử dụng chúng trong ngữ cảnh phản ứng hoặc đảm bảo rằng tất cả dữ liệu đã được tìm nạp trước khi thực thi (đừng lo lắng về điều sau cho đến khi bạn thành thạo với Meteor, hãy bắt đầu với cách đầu tiên).
Ngoài ra, bạn cần lưu ý rằng vì điều này, findOne
và find.fetch
có thể trả về null
/ mảng trống, ngay cả khi phần tử tương ứng nằm trong db (nhưng chưa được lưu vào bộ nhớ đệm). Nếu bạn không tính đến điều đó trong các chức năng phản ứng của mình, bạn sẽ gặp lỗi.
Template.article.slug = function() {
var article = Articles.findOne(current_article);
if(!article) return '';
return slugify(article.title);
};
Nếu chúng ta không thoát khỏi hàm với if(!article)
, biểu thức article.title
sẽ phát sinh lỗi trong lần tính toán đầu tiên, như article
sẽ là không xác định (giả sử nó không được lưu vào bộ nhớ cache trước đó).
Khi bạn muốn cập nhật cơ sở dữ liệu từ phía máy khách, bạn chỉ có thể thay đổi từng mục một và bạn phải tham khảo mục đó theo _id
của nó . Điều này là do lý do bảo mật. Dòng của bạn cho điều này là ổn:
Skills.update(Session.get('selected_skill'), {$inc: {mana: 1}});
alert()
là một hàm trả về không xác định cho dù bạn cho nó ăn gì.
alert(42); // -> undefined
Nói chung, nó xa tốt hơn nên gỡ lỗi bằng console.log
hơn với alert
.