【问题标题】:Meteor unsubscribe from Collection on ClientMeteor 在客户端取消订阅收藏
【发布时间】:2016-08-13 17:51:56
【问题描述】:

我正在尝试在不使用外部库的情况下在我的应用中实现分页,但我遇到了问题。我看到了一些其他主题,但它们似乎不适用于我的用例(或者完全遇到不同的问题)。这是我的模板。

{{#if Template.subscriptionsReady}}
  {{#each posts}}
    {{> postPreview}}
    <hr>
  {{/each}}
{{else}}
  {{> spinner}}
{{/if}}

<!-- Pager -->
<ul class="pager">
  {{#if showNewerPostsButton}}
    <li class="previous previousButton">
      <a>&larr; Newer Posts </a>
    </li>
  {{/if}}
  {{#if showOlderPostsButton}}
    <li class="next nextButton">
      <a>Older Posts &rarr;</a>
    </li>
  {{/if}}
</ul>

基本上它应该工作的方式是,当用户单击其中一个按钮时,服务器应该获取记录集中的下一个项目并“理想地”更新订阅以匹配。我在使订阅记录集与我想要的匹配时遇到问题:看起来 Meteor 一直在收集每个新订阅的记录。

Template.postsList.events({
  'click .nextButton': (e) => {
    let page = parseInt(FlowRouter.getParam('page'));
    if (page === undefined || isNaN(page)) {
      page = 0;
    }
    FlowRouter.setParams({ page: page + 1 });
  },
  'click .previousButton': (e) => {
    let page = parseInt(FlowRouter.getParam('page'));
    if (page === undefined || isNaN(page) || page < 1) {
      page = 1;
    }

    FlowRouter.setParams({ page: page - 1 });
  },
});

现在,当我单击按钮时,我很确定正在发生的事情是 Meteor 看到我对 FlowRouter 参数的更改并运行我的 template.autorun(如下)。我解决这个问题的第一个想法是使用Meteor.subscribe() 的返回handlehandle.stop() 订阅。不幸的是,在这个函数中,this.subscribe()Meteor.subscribe() 似乎都没有返回可用于handle.stop() 订阅的实际句柄,而是返回一个subscriptionId 字符串。我不知道如何使用这个字符串,或者是否可以使用它。

Template.postsList.onCreated(function () {
  var self = this;
  self.autorun(function () {
    var page = parseInt(FlowRouter.getParam('page'));
    if (page == undefined || page < 0 || isNaN(page)) {
      page = 0;
    }
    var handle = Session.get('postPreviewsHandle');
    if (handle) {
      console.dir(handle);
      handle.stop(); // Error! Function doesn't exist because this is only a string
    }

    // Meteor.subscribe() behaves the same way here
    handle = self.subscribe('postPreviews', page);

    Session.set('postPreviewsHandle', handle);
  });
});

我这样做对吗?为我指明正确方向的任何帮助都会非常棒——我已经尝试让分页工作几天了,但一直遇到障碍。

【问题讨论】:

    标签: javascript meteor meteor-blaze flow-router


    【解决方案1】:

    我不知道会话变量是否可以存储handle,但您可以尝试将其添加到模板实例 (self) 上

    Template.postsList.onCreated(function () {
      var self = this;
      self.autorun(function () {
        var page = parseInt(FlowRouter.getParam('page'));
        if (page == undefined || page < 0 || isNaN(page)) {
          page = 0;
        }
        var handle = self.handle;
        if (handle) {
          console.dir(handle);
          handle.stop();
        }
    
        self.handle = self.subscribe('postPreviews', page);
      });
    });
    

    【讨论】:

    • 感谢您的回答!不幸的是,在 'autorun()' 中调用 'subscribe()' 会导致 Meteor 返回一个字符串。因此,Afaik 无法手动“停止()”模板级订阅。
    猜你喜欢
    • 2015-10-15
    • 2017-02-03
    • 2018-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多