【问题标题】:Meteor.js Template does not update after variable assignmentMeteor.js 模板在变量赋值后不更新
【发布时间】:2013-06-16 06:16:01
【问题描述】:

我正在使用 Meteor 构建一个免费的电视跟踪应用程序,但在此过程中我似乎碰壁了。我的模板的一部分包含以下内容:

<template name="results">
  <div class="row">
      <div class="span6 offset6">
        <h4>Search Results</h4>
          <ul>
            {{#each series}}
            <li><a href="http://thetvdb.com/?tab=episode&seriesid{{tvdbseriesid}}&lid={{tvdblid}}">{{seriesname}}</li>
            {{/each}}
          </ul>
      </div>
    </div>
</template>

然后,在我的客户端 js 代码中,我这样做:

Template.search.events({
  'click #search' : function(evt) {
    evt.preventDefault();

    var query = $('#query').val();
    if (query) {
      Meteor.call('queryshow', query, function(error, result) {
        Template.results.series = result;
        console.log(Template.results());
      });
    }
  }
});

“queryshow”服务器方法只是一个 Collection 查询方法,它返回一个包含我的模板所需数据的对象。

但问题在于:更改并未反映在浏览器窗口中。我似乎不知道为什么,因为下面显示的 console.log(Template.results()) 调用返回了我期望的正确 html。

我该如何解决这个问题?我尝试查看 Meteor 的文档,但似乎找不到强制重新渲染模板的功能。任何帮助将不胜感激!

【问题讨论】:

  • 顺便说一句,这里有完整的代码:link

标签: javascript html templates dom meteor


【解决方案1】:

Template.results.series 应该是一个返回系列的函数,而不是直接设置为你要使用的系列。这样,当 Meteor 运行函数获取序列时,它可以注册函数所依赖的内容,然后在任何依赖项发生变化时重新运行函数。

为您的信息注册依赖项的最简单方法是使用Session 对象。所以你的代码看起来像:

Template.results.series = function () { return Session.get('resultsSeries'); }

Meteor.call('queryshow', query, function (err, res) {
  // handle the error if it's there
  // ...
  // Then set the session variable, which will re-run anything that depends on it.
  Session.set('resultsSeries', res)
}

【讨论】:

  • 嘿,非常感谢!这里有一个后续问题,如果我使用不同的变量而不是会话变量,我该如何实现相同的目标?这样当它发生变化时,它将重新运行附加到它的任何函数。谢谢!
猜你喜欢
  • 2023-03-09
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-08
  • 2020-05-14
  • 1970-01-01
  • 2012-07-04
相关资源
最近更新 更多