【问题标题】:How to use Session.setDefault() with external data inside helper如何将 Session.setDefault() 与助手内部的外部数据一起使用
【发布时间】:2016-02-24 15:17:42
【问题描述】:

我使用 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 变量时,我得到一个空数组[],可能是因为没有时间从服务器获取数据(或者可能不是,因为我正在使用自动发布进行开发)现在,我真的不知道)。

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

我尝试在Template.courses.rendered()Template.courses.created()Template.courses.onRendered()Template.courses.onCreated() 中调用Session.set()(是的,我有点绝望),但它们都不起作用。

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

谢谢!

【问题讨论】:

    标签: javascript meteor


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      这里有两件事。首先,只要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 [];
          }
      });
      

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

      希望对你有帮助。

      【讨论】:

      • 我在course helper 中返回Session.get('course'),因为稍后用户将过滤课程数据集以找到与他指定的过滤器匹配的课程。因此,每当他更改表单中的过滤器(只是输入和复选框)时,都会有一个事件处理程序相应地更改课程 Session 变量(进行新查找),然后重新渲染模板。跨度>
      猜你喜欢
      • 2017-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-22
      • 2011-09-22
      • 2016-11-13
      • 1970-01-01
      • 2016-05-17
      相关资源
      最近更新 更多