使用会话变量和订阅/发布更新模板仅使用先前的查询进行更新并附加信息

时间:2016-01-14 13:56:05

标签: javascript meteor

如何运作

我为视频集合(几乎是视频信息列表)和规范集合(与视频集合直接相关的信息列表)设置了下标/发布

简而言之,A Video属于一个Spec(aka:specialization),Spec可以有多个视频。

所以我有一个带有Specs列表的select。在change我想加载与该规范对应的集合中的所有视频。

我的技巧是在检测到开启更改时简单地调用Meteor.subscribe("videos-pub-sub", $(evt.target).val());。一旦使用正确的信息更新了集合,我就使用Session变量来更新我的模板。

然后是出版物的服务器端:

    Meteor.publish("videos-pub-sub", function (spec){
        console.log("Publishing videos...");
        var res = [];
        if(spec && spec > 0){
            console.log("Spec not empty: " + spec)
            res = Videos.find({spec: parseInt(spec)});
        }else{
            console.log("Spec not set...")
        }
        console.log("publication " + res.fetch().length);
        return res;
    });

问题和问题的描述

  1. 当我选择一个选项时,我的表中没有添加视频信息,即使在我的console.log中也正确检索了信息。 然而,当我进行第二次选择时,表格会填满之前的查询。为什么?
  2. 当我进行第三次选择更改时,先前的查询数据会附加到表中。不应该被替换吗?或者我是否必须手动清空表格?
  3. 相关HTML:

    <select id="categories">
      <option></option>
      {{#each specs}}
      <option value="{{id}}">{{name}}</option>
      {{/each}}
    </select>
    
    
    <table id="video_table" class="table table-striped table-hover">
      <thead>
        <tr>
          <th>ID</th>
          <th>Name</th>
          <th>Authors</th>
          <th>Date Published</th>
          <th>Abstract</th>
          <th>Category</th>
          <th>Private</th>
          <th>Online</th>
          <th>Upload</th>
        </tr>
      </thead>
      <tbody id="video_tbody">
        {{#each videos}}
        <tr>
          <td>{{id}}</td>
          <td>{{title}}</td>
          <td>{{authors}}</td>
          <td>{{date_published}}</td>
          <td>{{description}}</td>
          <td class="category" data-id="{{spec}}">
            {{specName}}
          </td>
          <td>
            <input type="checkbox" aria-label="..." checked="{{#if private}}checked{{/if}}">
          </td>
          <td>{{#if online}}<span class="label label-success">Online</span>{{else}}<span class="label label-default">Offline</span>{{/if}}</td>
          <td>
            <input type="checkbox" checked="checked">
          </td>
        </tr>
        {{/each}}
      </tbody>
    </table>
    

    相关JS:

      Template.List.events({
        'change #categories':function(evt){
    
          Meteor.subscribe("videos-pub-sub", $(evt.target).val());
    
          console.log('Change #categories detected');
          var vids = Videos.find({}).fetch();
          console.log(vids);
    
          Session.set("videos-session", Videos.find({}).fetch());
          console.log(Session.get("videos-session"));
    
        }
      });
    

    如果需要更多JS,我可以提供更多。

    我对Meteor相对较新,我仍在努力了解事情是如何运作的。如果您看到我可以改进的任何内容,请告诉我。

1 个答案:

答案 0 :(得分:1)

我在我的项目中看到,当在meteor上订阅/调用某些东西时,有时它会运行下一个代码行而没有收到预览服务器的答案,并且它会带来像你的一些问题。所以,我通常在subscribe / call函数中嵌套应该做的事情,然后只在返回数据后运行它。

我会做这样的事情:

SiteName

让我知道它是否有效!