【问题标题】:Iron meteor's Route doesn't fire rendered event of the template铁流星的路线不会触发模板的渲染事件
【发布时间】: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


【解决方案1】:

Meteor 尽可能避免重新渲染模板,这很棒,因为它使代码更快。这里的关键是使用反应性。所以你可以在 html 中写这样的东西:

<template name="example">
    <span id="text">{{text}}</span>
</template>

在js文件中:

Template.example.helpers({
    text: function() {
        return this;
    }
});

你不需要为此渲染函数,也不需要 jQuery。

如果您愿意,您可以使用 jQuery 从助手访问元素。 在渲染中

Template.example.rendered = function() {
    this.rendered = true;
}

然后在助手中

whateverHelper: function() {
    var tmpl = Template.instance;
    tmpl.rendered && tmpl.$('#something').makeFun();
}

【讨论】:

  • 正如我所说,我有一个更复杂的示例,我需要将图表渲染到画布元素。所以jQuery的使用是必要的。也许存在我可以强制破坏和重新渲染模板的方式?
  • 为什么不能像我在上面的例子中展示的那样在帮助器中使用 jQuery? Template.instance 是响应式的,因此如果模板数据发生变化,助手将重新运行。
猜你喜欢
  • 2015-01-18
  • 2017-03-14
  • 1970-01-01
  • 2015-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-14
相关资源
最近更新 更多