Meteor DB在模板外不一致

Meteor DB在模板外不一致,meteor,Meteor,这里有很多代码,人们可以准确地理解我的意思。我正在开发一个meteor应用程序,我在Mongo DB数据库中遇到了一些非常奇怪的行为,所以我编写了这个简单的测试程序来找出发生了什么。我观察到的行为是,当引用模板外部和内部的Meteor/Mongo DB集合时,会得到不同的结果。如果调用函数插入模板外部的集合,则只有在页面重新加载之前才能找到DB行。当从模板内部发起的调用插入行时,这些行将保持不变,但不可由模板外部的查找代码引用。要复制这个,您可以加载下面的程序。在页面加载时,它将向您发出警告1。

这里有很多代码,人们可以准确地理解我的意思。我正在开发一个meteor应用程序,我在Mongo DB数据库中遇到了一些非常奇怪的行为,所以我编写了这个简单的测试程序来找出发生了什么。我观察到的行为是,当引用模板外部和内部的Meteor/Mongo DB集合时,会得到不同的结果。如果调用函数插入模板外部的集合,则只有在页面重新加载之前才能找到DB行。当从模板内部发起的调用插入行时,这些行将保持不变,但不可由模板外部的查找代码引用。要复制这个,您可以加载下面的程序。在页面加载时,它将向您发出警告1。如果单击“插入”3次,然后单击“计数”,您将看到4次。如果重新加载,则会收到1的警报,如果单击“计数”,则会显示5。如果这是一个已知的和设计的行为,有没有什么技巧可以绕过它,或者你真的需要在使用meteor时使用所有模板

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>

你并不孤单——这是迄今为止流星工作方式中最被误解的方面。我在上的帖子中提到了一些答案,但这里是简要的总结:

  • 客户端开始运行时,您的数据尚未就绪。从服务器传输到客户端需要时间
  • 您的模板将立即呈现,而不是等待数据(除非您使用类似iron router的东西并带有
    waitOn
    回调)
  • Meteor是根据这些假设构建的(呈现模板-当文档更改时,更新UI)
在您的情况下,最初总是会看到“1”,因为您总是在客户机启动后立即插入。稍后,客户端将更新所有文档


要回答您的最后一个问题-是的,您应该使用模板。否则,您将与平台的实现方式背道而驰。

那么实际上是否同时存在本地和服务器端数据库?在返回结果之前,Find实际上没有等待服务器的响应吗?是和是。本地数据库称为minimongo。它是在客户端上运行的mongo的一个小型同步版本。客户端上的所有查找都命中minimongo,不等待服务器。在后台,文档与服务器同步。诀窍在于meteor理解集合游标是reactive的——这意味着在同步文档之后,UI应该响应。这是一个需要在评论中涵盖的大概念。:)
    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
  });
}