在我非常简单的 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();
}
});
最佳答案
实际上,是您的日志记录行导致帮助程序重新运行。
注意:我不想在这里深入细节,因为这是一个初学者级别的问题,但我仍然会尽量做到精确。
长话短说
它运行了两次,因为您在第一次渲染模板时没有数据。它与服务器上的 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/