0

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;
}
4

2 に答える 2

0

ステートメントで囲むよう{{#with test}}...{{/with}}にしてください (最初のデータ プッシュにはandフィールドがないため)。{{#if}}...{{/if}}testidname

<head>
  <title>test</title>
</head>

<body>
  {{> hello}}
</body>

<template name="hello">
  <h1>Hello World!</h1>
  {{#if test}}
    {{#with test}}
      ID: {{id}}  Name: {{name}}
    {{/with}}
  {{/if}}
  <input type="button" value="Click" />
</template>

結果として:

結果のページ

更新

numberこのコードは、すべてのレコードのフィールドの平均を計算します。

モデル.js:

Test = new Meteor.Collection("test");

Test.remove({});

if (Test.find().count() < 1) 
{
    Test.insert({id: 1,
                 name: "test1",
                 number: 13});

    Test.insert({id: 2,
                 name: "test2",
                 number: 75});
}

test.js

Test = new Meteor.Collection("test");

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;

  return { "obj": Test.findOne(), "avg": avg };
}

更新 2 :

このコードスニペットは私のために働きます:

var test = Test.findOne(); 
if (test) 
{ 
    test.rnd = Math.random(); 
} 
return test; 

たぶん、代入コードifもステートメントにラップする必要がありますか?

于 2012-07-11T19:52:43.023 に答える