javascript - Meteor 辅助函数总是在 Meteor.startup() 之前被调用,并且被调用两次而不是一次

标签 javascript node.js mongodb meteor meteor-blaze

在我非常简单的 meteor 项目中,客户端辅助函数被调用了两次。

项目中的三个文件是:

websites.js:作为模型类的 MongoDB 集合

image_share.html:包含 Blaze 模板

image_share.js:包含 blaze 模板的辅助函数

Helper 函数 webSites 被调用了两次,而本应被调用一次。 尽管我在 Meteor.startup() 填充了 mongoDB 集合 Websites,但该集合在第一次调用时显示 0 个项目,在第二个电话。

那么问题来了,为什么helper函数在Meteor.startup()之前被调用,为什么会被调用两次,并且在不同的调用中返回不同的值?

完整代码如下:

网站.js:

export const Websites = new Mongo.Collection("websites");

Meteor.startup(function(){
  if(Meteor.isServer){
    Websites.remove({});
    for(i = 0; i < 5; i++)
      Websites.insert({
        "x": "this is a sample text"
      });
  }
});

image_share.html:

<head> <title>courseraNewsAgg</title></head>
<body>
    {{> websiteList}}
</body>

<template name="websiteList">
  <h2 >Items: </h2>
    {{#each webSites}}
        <div>
           {{x}}
         </div>
    {{/each}}
</template>

image_share.js:

import { Template } from 'meteor/templating';
import { ReactiveVar } from 'meteor/reactive-var';
import {Websites} from "/import/websites.js";

Template.websiteList.helpers({
  webSites: function(){
    console.log("list size = " + Websites.find().count());
    return Websites.find();
  }
});

这是具有目录结构的完整项目: enter image description here

这是浏览器中带有控制台日志的输出: enter image description here

最佳答案

实际上,是您的日志记录行导致帮助程序重新运行。

注意:我不想在这里深入细节,因为这是一个初学者级别的问题,但我仍然会尽量做到精确。

长话短说

它运行了两次,因为您在第一次渲染模板时没有数据。它与服务器上的 Meteor.startup() 无关。


Meteor 中的模板助手是 reactive computations 。这些计算正在跟踪 react 性数据源,例如数据库查询游标(例如,Websites.find().count() 返回的游标。

当计算中的某些内容发生变化(无效)时,计算将重新运行。这是通过使用 Meteor 的 Tracker mechanism 实现的。在幕后。

你的情况会怎样

在页面加载时,您本地客户端的集合是空的。客户端订阅它们(或者,如果您使用的是 autopublish 包,订阅会自动为您创建 - 对于生产应用程序来说并不是一件好事)。

这是第一次呈现模板时,因此助手运行时会返回一组空记录,但由于您在那里有一个响应式(Reactive)数据源(count()调用),它对其进行监控。

您的服务器可能一直都有数据,只是您的客户端尚不可用。

一段时间后,数据从订阅到达,集合被更新并注意到被跟踪的计数现在不同了,因此计算无效并重新运行帮助程序。这次客户已经有了数据,结果是一组 5 个文档。它仍然监视光标的变化。

如果您以某种方式(例如,通过 Meteor 方法调用)添加新记录或删除服务器上的现有记录,发布将知道它并将新数据发送到客户端。

然后客户端的集合将被更新并使 count 计算无效,这将使助手中的计算无效并导致助手重新运行并再次查询集合。

如果我只从助手返回游标会怎样

在这种情况下,Blaze(模板库)将监控游标本身(通过观察它)并且只会以更精细的方式执行所需的更改。

关于javascript - Meteor 辅助函数总是在 Meteor.startup() 之前被调用,并且被调用两次而不是一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40079073/

相关文章:

javascript - 使用 keyup 事件将更改动态应用到多个元素

javascript - 在 HTML 中分配 XML-AJAX 响应

node.js - 在 Google Cloud Function 中按路径需要 key 文件

javascript - mongoose pre hook findOneAndUpdate 修改从另一个集合获取的某些字段

javascript - 如何正确使用 <%= link_to %> 的转义 javascript?

javascript - ShieldUI 网格 : how to get the row where the doubleclick is fired

node.js - 运行 npm-install 时出错 : Could not install . 错误!没有提供版本

javascript - 无法访问资源请求的回调函数内的变量

node.js - Nodejs Mongoose 错误: getaddrinfo ENOTFOUND undefined undefined:27017

c# - 如何模拟 IMongoDatabase