2

Meteor.publishフォーム フィールドの変更に応じて更新するのに問題があります。publish への最初の呼び出しは固執しているように見えるため、クエリはページがリロードされるまでそのサブセットで動作します。

この投稿のアプローチに従いましたが、まったく運がありません。

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

ライブラリ内:

SearchResults = new Meteor.Collection("Animals");

function getSearchResults(query) {
  re = new RegExp(query, "i");
  return SearchResults.find({$and: [ {is_active: true}, {id_species: {$regex: re}} ] }, {limit: 10});
}

クライアントで:

Session.set('query', null);

Template.searchQuery.events({
  'keyup .query' : function (event, template) {
    query = template.find('.query').value
    Session.set("query", query);
  }
});

Meteor.autosubscribe(function() {
  if (Session.get("query")) {
    Meteor.subscribe("search_results", Session.get("query"));
  }
});

Template.searchResults.results = function () {
  return getSearchResults(Session.get("query"));
}

サーバー上:

Meteor.publish("search_results", getSearchResults);

テンプレート: 動物を探す

<body>
  {{> searchQuery}}

  {{> searchResults}}
</body>

<template name="searchQuery">
  <form>
  <label>Search</label>
  <input type="text" class="query" />
</form>
</template>

<template name="searchResults">
  {{#each results}}
  <div>
    {{_id}}
  </div>
  {{/each}}
</template>

更新 [間違い]

どうやら問題は、私が扱っていたコレクションが Meteor の外部で (正しく) 生成されたことですが、Meteor は Mongo の ObjectIds を適切にサポートしていません。ここのコンテキストと関連する Stackoverflow question

そこに示されている変換コード、礼儀antoviaque :

db.nodes.find({}).forEach(function(el){
    db.nodes.remove({_id:el._id}); 
    el._id = el._id.toString(); 
    db.nodes.insert(el); 
});

更新 [右]

結局のところ、それはRegExp/の問題でした$regexこのスレッドは説明します。それ以外の:

function getSearchResults(query) {
  re = new RegExp(query, "i");
  return SearchResults.find({$and: [ {is_active: true}, {id_species: {$regex: re}} ] }, {limit: 10});
}

現時点では、代わりにこれを行う必要があります。

function getSearchResults(query) {
  // Assumes query is regex without delimiters e.g., 'rot'
  // will match 2nd & 4th rows in Tim's sample data below
  return SearchResults.find({$and: [ {is_active: true}, {id_species: {$regex: query, $options: 'i'}} ] }, {limit: 10});
}

それは楽しかった。

PS -- ddp-pre1 ブランチにはいくつかの ObjectId 機能があります ( SearchResults = new Meteor.Collection("Animals", {idGeneration: "MONGO"});)

4

1 に答える 1

1

これが私の実際の例です:

与えられた元のJavaScriptを更新してください。コメントに記載されているように、問題は流星がまだ ObjectIds をサポートしていないことが判明しました。

HTML:

<body>
  {{> searchQuery }}
  {{> searchResults}}
</body>

<template name="searchQuery">
  <form>
  <label>Search</label>
  <input type="text" class="query" />
</form>
</template>

<template name="searchResults">
  {{#each results}}
  <div>
     {{id_species}} | {{name}} - {{_id}}
  </div>
  {{/each}}
</template>

Javascript:

Animals = new Meteor.Collection("Animals");

function _get(query) {
    re = new RegExp(query, "i");
    console.log("rerunning query: " + query);
    return Animals.find({$and: [ {is_active: true}, {id_species: {$regex: re}} ] }, {limit: 10});
};

if (Meteor.isClient) {

    Session.set("query", "");

    Meteor.autosubscribe(function() {
        Meteor.subscribe("animals", Session.get("query"));
    });

    Template.searchQuery.events({
      'keyup .query' : function (event, template) {
        query = template.find('.query').value
        Session.set("query", query);
      }
    });

    Template.searchResults.results = function () {
        return _get(Session.get("query"));              
    }
}

if (Meteor.isServer) {
    Meteor.startup(function() {
        if (Animals.find().count() === 0) {
            Animals.insert({name: "panda", is_active: true, id_species: 'bear'});
            Animals.insert({name: "panda1", is_active: true, id_species: 'bearOther'});
            Animals.insert({name: "panda2", is_active: true, id_species: 'bear'});
            Animals.insert({name: "panda3", is_active: true, id_species: 'bearOther'}); 
        }
    });
    Meteor.publish("animals", _get);
}
于 2013-01-15T16:35:06.993 に答える