【发布时间】:2015-05-24 07:27:41
【问题描述】:
这是我的情况。我正在构建一个模板,该模板应该根据我可以通过标识符获得的一些数据呈现图表。
我将在这里展示的示例是我的代码的简化版本,它完全描述了我的问题。
这是我的 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 的方法 this.render('template') 渲染模板时,流星会创建并渲染此模板,这会导致创建和渲染的事件触发,但是如果您转到另一个来自同一路由器的 url,流星不会破坏此模板并重新创建他,而只是更改数据。因此,呈现的事件不会在 URL 更改时触发。
我只能使用呈现的事件而不是助手,因为从助手中我无法使用 JQuery 获取元素。
现在我正在使用将渲染事件中的所有逻辑包装到 Tracker.autorun() 并在路由器和会话中使用 Session.set('text', this.params.text) 的解决方案。自动运行函数中的 get('text') 以在每次 URL 更改时重新呈现文本。但是这个解决方案带来了额外的问题。而且我认为路由器的 this.render('templateName') 应该触发渲染事件。
能否请您帮助我在没有反应数据的情况下使第一个变体工作。也许有一些解决方案可以真正重新渲染模板?
【问题讨论】:
-
我也有同样的问题,几天前问了这个问题。除了注册数据上下文并通过它传递所有内容之外,我没有找到任何东西。
标签: javascript meteor iron-router