4

純粋な JavaScript を使用して Telescope に検索を実装しようとしました。FTS が Meteor に実装されるのはしばらく先のようで、まだ Meteor で 2.4 をうまく動作させることができなかったからです。

Telescope に既に実装されている既存のページネーション モデルを使用して、上位/新規/最良の投稿を表示します。また、/search/foobar などに移動したときに Router に設定された検索キーワードのセッション変数を使用しています。

ただし、まったく機能していないようです。たとえば、100 件の投稿がある場合、通常のページ分割されたサブスクリプションでは、そのうちの 25 件しか返されず、検索結果には最初の 25 件の投稿のみが表示されます。

私はこれをデバッグしようとして、何日も頭を壁にぶつけてきました。うまくいくこともあれば、うまくいかないこともあります!

コードは次のとおりです (参照用にすべての追加の検索コードを含めました)。

app.js:

var resultsPostsSubscription = function() {
  var handle = paginatedSearchSubscription( 10, 'searchResults' );
  handle.fetch = function() {
    return limitDocuments( searchPosts( Session.get( 'keyword' ) ), handle.loaded() );
  };
  return handle;
};

var resultsPostsHandle = resultsPostsSubscription();

paginated_sub.js:

セッション変数を引数として渡すことができないため、既存の paginatedSubscription を複製しました。動的である必要があります。おそらく後でリファクタリングします。

paginatedSearchSubscription = function (perPage/*, name, arguments */) {
  var handle = new PaginatedSubscriptionHandle(perPage);
  var args = Array.prototype.slice.call(arguments, 1);

  Meteor.autosubscribe(function() {
    var subHandle = Meteor.subscribe.apply(this, args.concat([
      Session.get( 'keyword' ), handle.limit(), function() { handle.done(); }
    ]));
    handle.stop = subHandle.stop;
  });

  return handle;
}

search.js: (新しいファイル、/common ディレクトリにあります)

// get all posts where headline, categories, tags or body are LIKE %keyword%
searchPosts = function( keyword ) {
  var query = new RegExp( keyword, 'i' );
  var results = Posts.find( { $or: [ { 'headline': query }, { 'categories': query }, { 'tags': query }, { 'body': query } ] } );
  return results;
};

パブリッシュ.js:

Meteor.publish( 'searchResults', searchPosts );

posts_list.html:

<template name="posts_results">
  {{> posts_list resultsPostsHandle}}
</template>

posts_list.js:

Template.posts_results.resultsPostsHandle = function() { 
  return resultsPostsHandle;
};

router.js: ナビゲーションに検索バーがあり、ここにリダイレクトされます

posts_results = function( keyword ) {
  Session.set( 'keyword' , keyword );
  return 'posts_results';
};

Meteor.Router.add({
    ...
  '/search/:keyword':posts_results,
  ...
})

どんな助けでも大歓迎です!

4

1 に答える 1