Javascript 流星收集故障
首先,很抱歉我是一个完整的JavaScriptNoob,我更喜欢PHP,我正在测试meteor框架 我尝试循环遍历对象集合,并尝试从其他集合添加属性,如下所示:Javascript 流星收集故障,javascript,collections,meteor,Javascript,Collections,Meteor,首先,很抱歉我是一个完整的JavaScriptNoob,我更喜欢PHP,我正在测试meteor框架 我尝试循环遍历对象集合,并尝试从其他集合添加属性,如下所示: Template.host.hosts = function() { var hosts = Hosts.find(); hosts.forEach(function(host) { host.lastPing = Pings.findOne({id: host.id}, {sort: {timesta
Template.host.hosts = function() {
var hosts = Hosts.find();
hosts.forEach(function(host) {
host.lastPing = Pings.findOne({id: host.id}, {sort: {timestamp : -1}});
// This works fine
// console.log(host.lastPing.id);
});
for (host in hosts) {
// This results in "TypeError: Cannot read property 'id' of undefined"
console.log(host.lastPing.id);
}
return hosts;
};
我不明白为什么第二个console.log不工作
我尝试过搜索,但我不知道问题是否与meteor处理集合的方式有关,或者我应该向javascript对象添加属性的方式,或者完全无关的东西(范围等…)
我简化了我的问题,试图了解发生了什么,我真正的问题显然是在模板中循环,如下所示:
{{#each hosts}}
{{this.lastPing.id}}
{{/each}}
谢谢三件事:
\u id
中,而不是id
中forEach
方法的上下文中,host
迭代通过Hosts.find()
返回的查询集,但实际上它不允许您访问文档本身。本质上,它是MongoDB中信息的副本,而不是数据库中的文档
更新实际文档的正确(也是唯一)方法是使用以下方法:
(请注意,您只能在客户端上通过\u id
进行更新,这就是我在这里使用的原因,而您可以在服务器上提供任何查询。)hosts
对象是光标而不是数组。这意味着,当您在hosts中对host使用时,实际上是在遍历游标对象的属性(从原型继承而来)而不是主机数组,并且没有一个主机具有id属性。执行此操作的一种方法是获取查询集并将其放入hosts
,如下所示:
var hosts = Hosts.find().fetch();
或者,您可以按住光标并再次使用forEach
,不过您必须使用hosts.rewind()
,或者重复上面的行以将其重置为查询集的开头
希望这会有帮助 非常感谢主持人。更新成功了,我将不得不重新阅读这篇详细的文章几次,以便完全理解。
var hosts = Hosts.find().fetch();