我为自己创建了一个小例子,用 Meteor 测试一些东西。但是现在看起来我无法订阅集合,我在服务器端发布。我希望有人能告诉我错误在哪里。
服务器/model.js
Test = new Meteor.Collection("test");
if (Test.find().count() < 1) {
Test.insert({id: 1,
name: "test1"});
Test.insert({id: 2,
name: "test2"});
}
Meteor.publish('test', function () {
return Test.find();
});
客户端/test.js
Meteor.subscribe("test");
Test = new Meteor.Collection("test");
Template.hello.test = function () {
console.log(Test.find().count());//returns 0
return Test.findOne();
}
Template.hello.events = {
'click input' : function () {
// template data, if any, is available in 'this'
if (typeof console !== 'undefined')
console.log("You pressed the button");
}
};
客户端/test.html
<head>
<title>test</title>
</head>
<body>
{{> hello}}
</body>
<template name="hello">
<h1>Hello World!</h1>
{{#with test}}
ID: {{id}} Name: {{name}}
{{/with}}
<input type="button" value="Click" />
</template>
编辑 1
我想更改对象测试,findOne() 返回。假设添加一个属性 avg,其中包含两个数字(test.number1 和 test.number2)的平均值。在我看来,这应该类似于以下代码。但是javascript不是同步的,所以这行不通。
Template.hello.test = function () {
var test = Test.findOne();
test.avg = (test.number1 + test.number2) / 2;
return test;
}
编辑 2
这段代码对我有用。现在我必须重新考虑为什么这个带有'if(test)'的解决方案只适用于我原始项目中没有选择器的findOne()。
Template.hello.test = function () {
var avg = 0, total = 0, cursor = Test.find(), count = cursor.count();
cursor.forEach(function(e)
{
total += e.number;
});
avg = total / count;
var test = Test.findOne({id: 1});
if (test) {
test.avg = avg;
}
return test;
}