【问题标题】:How to change the value of a variable on click in meteor如何在点击流星时更改变量的值
【发布时间】:2014-03-30 19:20:35
【问题描述】:

在我的流星应用程序中,我需要加载与单击的项目相对应的项目数组。由于我是流星的新手,所以我被困在这里。这是我的代码。

Template.templatename.events({
'click .showdiv' : function()
{
  Template.templatename.vname = function () {
  return Db.find();
  }
}

我可以通过这段代码动态设置变量 vname 吗?这对我不起作用。

【问题讨论】:

  • 它究竟是如何“不工作”的?
  • 我在模板中渲染变量 vname 并且它没有显示出来。

标签: meteor


【解决方案1】:

我认为您误解了反应性的概念。 reactive data source 将导致任何依赖它的函数(包括帮助程序)在其值更改时重新运行,这似乎是您在此处寻找的行为。相反,每次单击项目时,您都在重写辅助函数本身,这会破坏 Meteor 的反应数据模型的对象。会话变量可能会有所帮助:

Template.templatename.events({
    'click .showdiv' : function() {
        Session.set('vname', Db.find());
    }
});

Template.templatename.vname = function () {
    return Session.get('vname');
}

如果您在templatename 模板中使用{{#each vname}} 块,当单击.showdiv 时,它将自动更新为Db.find() 查询的结果。如果您想要做的只是显示该查询的结果,而不管是否已注册点击,它会很简单:

Template.templatename.vname = function () {
    return Db.find();
}

请注意,由于查询将返回游标(这很好,但您需要使用 {{#each ...}} 循环遍历它 - 如果您只使用 findOne想要一个项目),它的内容不会依赖于点击事件的任何内在因素(比如你点击了.showdiv)。然而,在前一个示例中,它会在第一次单击之前无法显示任何内容(之后您必须使用 Session.set('vname', null) 重置以停止再次显示任何内容)。

【讨论】:

  • 场景就像,我有一个用户列表,点击一个用户时,我需要在定义为另一个模板的弹出窗口中显示与另一个集合中的用户相关的一些数据。
  • 关于Session.set('vname', Db.find()); - 有some problems with setting cursors as Session variables。您对此有何看法?
  • 是的,同意,这是一个脆弱的解决方案,在本示例中完全没有必要,因为您可以只返回游标本身并完全避免使用 Session 变量。另一种方法是fetch 结果并将它们存储在 Session 变量中,但这显然不是最佳选择。
猜你喜欢
  • 1970-01-01
  • 2014-04-05
  • 2020-11-28
  • 1970-01-01
  • 2016-04-24
  • 2014-02-01
  • 1970-01-01
  • 2019-09-17
  • 1970-01-01
相关资源
最近更新 更多