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");
}
};
client/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() が返されます。2 つの数値 (test.number1 と test.number2) の平均値を含む属性 avg を追加するとします。私の意見では、これは次のコードのようになります。ただし、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;
}