【问题标题】:Meteor DB Inconsitent outside of templateMeteor DB 在模板之外不一致
【发布时间】:2019-03-23 23:42:52
【问题描述】:

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

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

还有 test.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
  });
}

【问题讨论】:

    标签: meteor


    【解决方案1】:

    你并不孤单——这是迄今为止关于流星工作原理最被误解的方面。我在guards 上的帖子中解决了一些答案,但这里是快速摘要:

    • 客户端开始运行时,您的数据还没有准备好。从服务器传输到客户端需要时间。
    • 您的模板将立即呈现,而不是等待数据(除非您使用带有 waitOn 回调的 Iron-router 之类的东西)。
    • Meteor 在构建时考虑了这些假设(渲染模板 - 当文档更改时更新 UI)。

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

    要回答您的最后一个问题 - 是的,您应该使用模板。否则,您将违反平台的实施方式。

    【讨论】:

    • 那么本地和服务器端数据库实际上都存在吗? Find 在返回结果之前实际上并没有等待服务器的响应吗?
    • 是的,是的。本地数据库称为 minimongo。这是在客户端上运行的 mongo 的小型同步版本。客户端上的所有发现都点击 minimongo 并且不要等待服务器。在后台,文档与服务器同步。诀窍是meteor 理解集合游标是reacive - 这意味着在文档同步后,UI 应该响应。这是一个需要在评论中涵盖的大概念。 :)
    猜你喜欢
    • 2017-08-27
    • 2015-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多