Iron meteor的Route不会触发模板的渲染事件

时间:2015-03-20 19:09:41

标签: javascript meteor iron-router

这是我的情况。我正在构建一个模板,该模板应该基于我可以通过标识符获得的一些数据来呈现图表。

我将在此处展示的示例是我的代码的简化版本,它完全描述了我的问题。

这是我的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')应该触发渲染事件。

请您帮助我让第一个变种在没有反应数据的情况下工作。也许有一些解决方案可以真正重新呈现模板?

1 个答案:

答案 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();
}