这是我的情况。我正在构建一个模板,该模板应该基于我可以通过标识符获得的一些数据来呈现图表。
我将在此处展示的示例是我的代码的简化版本,它完全描述了我的问题。
这是我的HTML:
<head>
<title>example</title>
</head>
<body>
</body>
<template name="layout">
<a href="/firstText">First text</a>
<a href="/anotherText">Another text</a>
{{> yield}}
</template>
<template name="example">
<span id="text">Basic Text</span>
</template>
和JavaScript:
if (Meteor.isClient) {
Router.configure({
layoutTemplate: 'layout'
});
Router.route('/:text', function() {
this.render('example', {
data: this.params.text
});
});
Template.example.rendered = function() {
$('#text').html(this.data);
}
}
此代码将您在url中放入的任何内容呈现为“p”标记。如果您将浏览第一个链接,您将获得文本“firstText”。但是在它之后,如果你将浏览另一个链接,文本将是相同的。如果您只是重新加载页面,则会更改文本。
这是因为当你通过iron:router's方法this.render('template')渲染模板时,meteor会创建并渲染这个模板,导致创建和渲染事件的激发,但是如果你去另一个来自同一个路由器的url,流星不会破坏这个模板并重新创建他,但只是更改数据。因此,渲染事件不会在更改URL时触发。
我只能使用渲染事件而不是帮助器,因为从帮助器我无法使用JQuery获取元素。
现在我正在使用解决方案,我将渲染事件中的所有逻辑包装到Tracker.autorun()中,并在路由器和Session中使用Session.set('text',this.params.text)。每次URL更改时,在自动运行功能中获取('text')以重新呈现文本。但是这种解决方案会带来其他问我认为Router的this.render('templateName')应该触发渲染事件。
请您帮助我让第一个变种在没有反应数据的情况下工作。也许有一些解决方案可以真正重新呈现模板?
答案 0 :(得分:0)
Meteor避免了尽可能多地重新渲染模板,这很棒,因为它使代码更快。这里的关键是使用反应性。所以你可以在html中编写类似的东西:
<template name="example">
<span id="text">{{text}}</span>
</template>
并在js文件中:
Template.example.helpers({
text: function() {
return this;
}
});
您不需要渲染函数,也不需要jQuery。
如果你想要,你可以使用jQuery从helper访问元素。 在渲染中
Template.example.rendered = function() {
this.rendered = true;
}
然后在帮助
中whateverHelper: function() {
var tmpl = Template.instance;
tmpl.rendered && tmpl.$('#something').makeFun();
}