2

外部ライブラリを使用せずにアプリにページネーションを実装しようとしていますが、問題が発生しています。これに関する他のトピックをいくつか見ましたが、それらは私のユースケースには当てはまらないようでした (またはまったく別の問題が発生していました)。これが私のテンプレートです。

{{#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>

基本的には、ユーザーがボタンの 1 つをクリックすると、サーバーがレコード セット内の次のアイテムを取得し、「理想的には」一致するようにサブスクリプションを更新することになっています。サブスクリプション レコード セットを希望どおりにするのに問題があります。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 がFlowRouterparams への変更を確認し、template.autorun(下記) を実行していると確信しています。この問題を解決するために私が最初に考えたのは、サブスクリプションMeteor.subscribe()に返さhandleれた を使用することでした。handle.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);
  });
});

私はこれを正しく行っていますか?これについて正しい方向に私を向ける助けは非常に素晴らしいでしょう-私は数日間ページネーションを機能させようとしてきましたが、ハードルにぶつかり続けています.

4

1 に答える 1

0

セッション変数に a を格納できるかどうかはわかりませんが、代わり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);
  });
});
于 2016-04-21T01:41:20.930 に答える