0

现在我有类似的东西

 var cursor = self.apos.docs.find(req, { highSearchText:  {$regex: new RegExp(self.apos.utils.regExpQuote(req.query.search), 'i') }  } )

 cursor.queryToFilters({ highSearchText:  {$regex: new RegExp(self.apos.utils.regExpQuote(req.query.search), 'i') }  }, 'public')

.perPage(self.perPage);

我正在想办法实现自动完成

4

1 回答 1

1

如你所知,我是朋克大道 Apostrophe 团队的负责人。

您正在尝试方式,方式,方式太难了(:

在表单中将搜索字段命名为“自动完成”。

然后这样做:

var cursor = self.apos.docs.find(req, {})
  .queryToFilters(req.query, 'public')
  .perPage(self.perPage);
};

真的……就是这样。的全部目的queryToFilters基本上就是这样做(不完全是,请参阅下面的安全说明,了解它的实际作用):

// DON'T DO THIS, JUST GIVES YOU AN IDEA OF WHAT'S GOING ON
_.each(req.query, function(val, key) {
  cursor[key](val);
});

req.query它调用与(嗯,几乎)的属性同名的游标方法。

当然那是不安全的,但要queryToFilters特别确保有问题的方法是光标过滤器,它们被标记为safeFor: 'public'并运行它们的清理程序。

autocomplete是这样一个光标过滤器,所以...繁荣,我们完成了。

另外,我看到您正在self.apos.docs.find直接使用。我假设您这样做是因为您希望从查询中返回所有类型的文档,在这种情况下,您正在做正确的事情。

如果不清楚,如果您甚至没有首先使用查询字符串,您可以autocomplete直接使用您拥有的任何内容进行调用:

cursor.autocomplete('startofaword');

希望这有帮助!

于 2016-11-18T22:13:28.667 回答