如何在helper中使用Session.setDefault()和外部数据

时间:2016-02-23 20:14:43

标签: javascript meteor

我使用 Meteor 1.2.1 。我目前正在开发课程目录Web应用程序。 我正在尝试像Angular Filters一样创建过滤功能。它应该让用户指定他的需求,然后当他更改过滤器时,课程列表会自动刷新。

这是我的代码:

app.html

<!-- ********** -->
<!-- courseList -->
<!-- ********** -->
<template name="courseList">
  <div class="list-header">
    <div>Course Name</div>
    <div>Description</div>
    <div>Category</div>
    <div>Modality</div>
    <div>Unit</div>
  </div>
  <div class="list-body">
    {{ #each course }}
      {{ > courseRow}}
      <hr />
    {{ /each }}
  </div>
</template>

app.js

  Template.courseList.helpers({
    'course': function(){
      Session.setDefault('course', Courses.find().fetch());
      return Session.get('course');
    }
  });

所以当我运行它时,我得到了上面course helper的空集,即使数据库中存在一些虚拟数据。

在我看来,问题出在Session.setDefault()上。当我在查找后立即调用Session.course变量时,我得到一个空数组[],可能是因为没有时间从服务器获取数据(或者可能没有,因为我是现在用autopublish开发,我真的不知道。)

在我应用了一些过滤器(此处未显示的代码)后,一切都恢复正常。这种初始化只是问题所在。

我试图在Session.set()Template.courses.rendered()Template.courses.created()Template.courses.onRendered()内打电话Template.courses.onCreated()(是的,我有点绝望),但没有一个工作

有人可以就这个问题提出建议吗?也许我没有尝试正确的Meteor aproach,因为我是流星初学者。

谢谢!

2 个答案:

答案 0 :(得分:0)

我认为您尝试使用模板subsciption。所以你可以发一些条款出版。例子;

Template.foo.onCreated(function() {
  this.name = new reactiveVar("");

  this.autorun( () => {
    const terms = {
      name: this.name.get()
    };

    this.subscribe("Posts_list", terms);
  });
});

Template.foo.helpers({
  lists: function() {
    return Posts.find().fetch();
  }
});

答案 1 :(得分:0)

这里有两件事。首先,只要Courses.find().fetch()Session.get('course')的结果发生变化,您的助手就会运行,因为它们都是reactive data sources。为了避免这种情况,你可以做到

Template.foo.helpers({
  lists: function() {
    return Posts.find().fetch();
  }
});

如果您想设置会话变量以便可以在其他地方使用它,那么您可以使用Session.set而不是Session.setDefault,因为Session.setDefault只会分配值会话变量尚不可用。但是我不知道你为什么要这样做,因为你可以使用Posts.find().fetch()而不是会话变量。两者都是被动的。

Template.foo.helpers({
  lists: function() {
    Session.set('course', Courses.find().fetch());
    return Session.get('course');
  }
});

如果您只想在获得非空数据时第一次分配course会话变量,那么您可能希望这样做。

Template.foo.helpers({
  lists: function() {
    if (Courses.find().count() > 0) {
        Session.setDefault('course', Courses.find().fetch());
        return Session.get('course');
    } else {
        return [];
    }
});

如果你能说出为什么需要会话变量,我们可能会想到一种不同的方法来解决这个问题。

希望它有所帮助。