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");
  }
};

客户端/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;
}
4

2 回答 2

3

客户端 db 用于复制数据的延迟可能会导致游标不计算结果的情况。当应用程序加载时立即呈现模板时,尤其会发生这种情况。

一种解决方法是在查询文档进入结果集时对其进行观察。因此,例如以下内容恰好可以很好地工作:

Meteor.subscribe("Coll");

var cursor = Coll.find();

cursor.observe({
  "added": function (doc) {
    ... something...
  }
})
于 2013-03-17T15:15:16.553 回答
0

尝试{{#with test}}...{{/with}}{{#if}}...{{/if}}语句包围(因为在第一次数据推送test中没有idname字段):

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

测试.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 回答