Meteor DB在模板外部不一致

时间:2014-07-21 14:25:28

标签: meteor

有很多代码,所以人们可以清楚地看到我的意思。我正在研究一个流星应用程序,我在Mongo数据库数据库中遇到了一些非常奇怪的行为,所以我写了这个简单的测试程序来找出发生了什么。我观察到的行为是,当您在模板外部引用Meteor / Mongo数据库集合时,您会得到不同的结果。如果调用函数插入模板外部的集合,则只能在页面重新加载之前找到数据库行。当从来自模板内部的调用插入行时,它们会持久存在但不能被模板外部的查找代码引用。要复制此内容,您可以加载以下程序。在页面加载时它将提醒您1.如果单击插入3次并单击计数,您将看到4.如果您重新加载,您将收到1的警报,然后如果您点击计数它将说5.如果这是已知和设计行为是否有任何技巧可以绕过它,或者在使用流星时你真的必须使用模板吗?

的test.html

 <head>
    <title>Templates</title>
</head>

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


<template name="hello">
    <h1>Hello World!</h1>
    {{greeting}}
    <input type="button" value="Insert" class="insert"/>
    <input type="button" value="Count" class="count"/>
    <input type="button" value="Remove All" class="remove"/>
</template>

用它测试.js

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

if (Meteor.isClient) {
    Template.hello.greeting = function () {
        return "Welcome to test";
    };

    Template.hello.events({
        'click input.insert': function () {
            // template data, if any, is available in 'this'
            Test.insert({testid:"test"});
        },
        'click input.count': function () {
            alert(Test.find().count());
        },
        'click input.remove': function () {
            var cursor = Test.find();
            cursor.fetch().forEach(function(test){
                Test.remove(test._id);
            });
        }
    });
    Test.insert({test:"test"});
    var testCursor = Test.find();
    alert(testCursor.count());
}

if (Meteor.isServer) {
  Meteor.startup(function () {
    // code to run on server at startup
  });
}

1 个答案:

答案 0 :(得分:2)

你并不孤单 - 这是迄今为止流星最常被误解的方面。我在guards的帖子中提到了一些答案,但这里是快速摘要:

  • 客户端开始运行时,您的数据尚未就绪。从服务器传输到客户端需要时间。
  • 您的模板会立即呈现,而不是等待数据(除非您使用铁路由器进行waitOn回调)。
  • Meteor在构建时考虑了这些假设(渲染模板 - 当文档发生变化时更新UI)。

在您的情况下,您最初将始终看到“1”,因为您始终在客户端启动时立即执行插入操作。稍后,客户端将更新所有文档。

要回答您的上一个问题 - 是的,您应该使用模板。否则,你正在反对平台的实施方式。