在添加 accounts-ui 包后,Meteor 模板被创建了两次
Meteor template gets created twice, after adding accounts-ui package
我开始学习 meteor 并且设置了一个小的测试项目。我做了一个像这样的简单模板 test.html:
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="">
<meta name="author" content="">
<title>Test</title>
</head>
<body>
{{> TestPage}}
</body>
<template name="TestPage">
<p>hello</p>
</template>
我还安装了 iron-router
并且尝试设置了路由。然后我检查了 meteor run
,一切正常,我得到了一个带有 hello
文本符号的普通页面。之后我想尝试制作简单的登录页面,我添加了meteor add accounts-ui accounts-password
。之后,当我尝试加载我的页面时,hello
显示了两次。所以我去了 js 部分,试图了解发生了什么。这里是完整的 test.js:
var textMessage = "";
var textMessageDep = new Deps.Dependency;
var getTextMessage = function()
{
textMessageDep.depend();
return textMessage;
};
var setTextMessage = function (newValue) {
if (newValue !== textMessage)
textMessageDep.changed();
textMessage = newValue;
};
Template.TestPage.onRendered(function () {
console.log('on rendered');
});
Template.TestPage.onCreated(function () {
console.log('on created');
});
因此,我设法在 js 控制台中获得以下输出:
on created
on created
on rendered
On created
事件由于某种原因被调用了两次,这就是为什么我渲染了两个模板副本。如何正确克服这个问题?我假设流星等待 Meteor.Users
集合准备好?我什至没有向这个集合添加任何用户。
这也是我的路由器配置的样子:
Router.map(function() {
this.route('/', {
onBeforeAction: function () {
// here planned to add
// if(!Meteor.user()) {}
//
this.render('TestPage');
}
});
});
这是因为你让Meteor渲染了两次模板。默认情况下,meteor
将首先加载带有 body
标签的任何文件,也就是您此时放入 TestPage
模板的文件。然后,您将 TestPage
的另一个渲染放入 onBeforeAction
,因此,另一个 TestPage
出现在页面上。解决此问题的一种方法是删除 onBeforeAction
中的那个
指定要在路由器中呈现的模板的正确方法是
this.route('TestPage', {
path: '/'
});
并删除 body
中的那个
我开始学习 meteor 并且设置了一个小的测试项目。我做了一个像这样的简单模板 test.html:
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="">
<meta name="author" content="">
<title>Test</title>
</head>
<body>
{{> TestPage}}
</body>
<template name="TestPage">
<p>hello</p>
</template>
我还安装了 iron-router
并且尝试设置了路由。然后我检查了 meteor run
,一切正常,我得到了一个带有 hello
文本符号的普通页面。之后我想尝试制作简单的登录页面,我添加了meteor add accounts-ui accounts-password
。之后,当我尝试加载我的页面时,hello
显示了两次。所以我去了 js 部分,试图了解发生了什么。这里是完整的 test.js:
var textMessage = "";
var textMessageDep = new Deps.Dependency;
var getTextMessage = function()
{
textMessageDep.depend();
return textMessage;
};
var setTextMessage = function (newValue) {
if (newValue !== textMessage)
textMessageDep.changed();
textMessage = newValue;
};
Template.TestPage.onRendered(function () {
console.log('on rendered');
});
Template.TestPage.onCreated(function () {
console.log('on created');
});
因此,我设法在 js 控制台中获得以下输出:
on created
on created
on rendered
On created
事件由于某种原因被调用了两次,这就是为什么我渲染了两个模板副本。如何正确克服这个问题?我假设流星等待 Meteor.Users
集合准备好?我什至没有向这个集合添加任何用户。
这也是我的路由器配置的样子:
Router.map(function() {
this.route('/', {
onBeforeAction: function () {
// here planned to add
// if(!Meteor.user()) {}
//
this.render('TestPage');
}
});
});
这是因为你让Meteor渲染了两次模板。默认情况下,meteor
将首先加载带有 body
标签的任何文件,也就是您此时放入 TestPage
模板的文件。然后,您将 TestPage
的另一个渲染放入 onBeforeAction
,因此,另一个 TestPage
出现在页面上。解决此问题的一种方法是删除 onBeforeAction
指定要在路由器中呈现的模板的正确方法是
this.route('TestPage', {
path: '/'
});
并删除 body