如何使用更多参数在流星中搜索集合
How to search collection in meteor with more parameters
我需要帮助来搜索带有更多参数的流星集合。
我正在使用搜索查询和过滤器来查看集合中的某些对象。问题是我希望客户端加载整个集合,然后反应性地改变用户看到的内容,但只改变订阅,而不是再次调用服务器。 Thill 现在搜索查询 + 一个过滤器工作正常,但前提是每次发生变化时我都调用服务器。现在在我下面的代码中,您可以看到我正在使用 if else 元素来执行此操作,但这不是一个好方法。任何建议都会有所帮助。谢谢。
Template.jobs.onCreated( function showOnCreate() {
Meteor.subscribe('Jobs');
this.searchQuery = new ReactiveVar('');
this.remoteQuery = new ReactiveVar(false);
this.typeQuery = new ReactiveVar(false);
});
Template.jobs.helpers({
job: () => {
query = Template.instance().searchQuery.get();
remoteQuery = Template.instance().remoteQuery.get();
typeQuery = Template.instance().typeQuery.get();
let regex = new RegExp( query, 'i' );
// **************************
// the problem starts here
// **************************
if (Router.current().params.slug) {
const companyJobs = Company.findOne({slug: Router.current().params.slug}).jobs;
if ( companyJobs !== undefined) {
return Meteor.subscribe('Jobs', {'_id': { '$in': companyJobs }});
}
return false
} else if (Router.current().params.slug === undefined && remoteQuery === true ) {
return Job.find({ $or: [ { Name: regex }, { Description: regex }, ] , Remote: true, positionType: [],});
} else if (typeQuery = '') {
return Job.find({ $or: [ { Name: regex }, { Description: regex }, ] , positionType: typeQuery, });
},
// -------*****************************
employer: () => {
if (Router.current().params.slug === undefined) {
Meteor.subscribe('Companies');
return 'Poslodavac: ' + Company.findOne({_id: Template.currentData().CompanyId}).Name;
}
return false
},
jobUrl: () => {
Meteor.subscribe('Companies');
companySlug = Company.findOne({_id: Template.currentData().CompanyId}).slug;
return ('/company/' + companySlug + '/job/' );
}
});
Template.jobs.events({
'click .positionType': (event, templateInstance) => {
if (Template.instance().remoteQuery.get().lenght > 1){
Template.instance().typeQuery.set(Template.instance().remoteQuery.get().push(event.target.value));
console.log(Template.instance().remoteQuery.get())
} else {
console.log(Template.instance().remoteQuery.get())
console.log('ggggggg')
Template.instance().typeQuery.set(event.target.value);
}
},
'click #remoteFriendly': (event, templateInstance) => {
Template.instance().remoteQuery.set(!Template.instance().remoteQuery.get());
},
});
Html 带过滤器的模板:
<template name="jobs" >
<div>
<p>Filteri:</p>
<span>
<input type="checkbox" id="remoteFriendly" name="remote"> <span for="remoteFriendly"> Remote friendly? </span>
</span>
<span>
<p>Tip pozicije:</p>
<input type="checkbox" class="positionType" id="1" value="Programiranje" > <span for="1"> Programiranje </span>
<input type="checkbox" class="positionType" id="2" value="Dizajn" > <span for="2"> Dizajn </span>
<input type="checkbox" class="positionType" id="3" value="Marketing" > <span for="3"> Marketing </span>
<input type="checkbox" class="positionType" id="4" value="Ostalo" > <span for="4"> Ostalo </span>
</span>
</div>
{{#each job}}
<div style="border: 0.1rem solid black; margin: 1cm; padding: 5px; max-width: 420px;" > <!-- OVO JE PRIVREMENI STIL, OBRISATI-->
<p> Posao: {{Name}} <br> Opis: {{Description}}</p>
<p> {{employer}} </p>
<p>Remote friendly?: {{Remote}}</p>
<p>Tip pozicije: {{positionType}}</p>
<p> Saznajte vise <a href="{{jobUrl}}{{_id}}"> OVDE</a></p>
</div>
{{/each}}
<p id="nesto"></p>
</template>
欢迎来到 SO!
您似乎混淆了 Pub/Sub 和 Collection.find
。
您应该首先意识到这 2 个是不同的机制,它们提供不同的功能。
- Pub/Sub 确实将数据从您的服务器发送到您客户端的 Minimongo 数据库。但是这个数据还没有显示出来。
Collection.find
在您的服务器上用于您的实际 MongoDB,并在您的客户端上用于您的本地 Minimongo 数据库。
因此在您的客户端上,一旦您正确订阅了您的服务器发布(通常在应用程序级别或模板级别/在 onCreated
挂钩中),您可以直接在您的助手中调用 Jobs.find
(或其他任何地方)获取您的文档,而无需更改订阅(除非后者需要新参数)。
你注释的代码应该没有问题:
return Job.find({'_id': { '$in': companyJobs }});
一般来说,避免在助手中进行任何昂贵的计算(如 Meteor.subscribe
),因为助手可能会在您不注意的情况下执行多次。您的 Meteor.subscribe('Companies')
也应该进入模板级别(即在 onCreated
挂钩中)。
因此,与其在助手中执行 if / else
条件,不如在模板级别执行一次。考虑到您需要使用另一个集合中另一个文档的值,为什么不直接将公司的 slug 作为参数传递给您的 Jobs 订阅,并在服务器端执行计算?或者甚至只是订阅所有内容,就像您当前的初始订阅一样。
那么您的助手将只使用 Jobs.find
,它会查询您客户的本地 minimongo 数据库,而不会影响您的服务器。
我需要帮助来搜索带有更多参数的流星集合。 我正在使用搜索查询和过滤器来查看集合中的某些对象。问题是我希望客户端加载整个集合,然后反应性地改变用户看到的内容,但只改变订阅,而不是再次调用服务器。 Thill 现在搜索查询 + 一个过滤器工作正常,但前提是每次发生变化时我都调用服务器。现在在我下面的代码中,您可以看到我正在使用 if else 元素来执行此操作,但这不是一个好方法。任何建议都会有所帮助。谢谢。
Template.jobs.onCreated( function showOnCreate() {
Meteor.subscribe('Jobs');
this.searchQuery = new ReactiveVar('');
this.remoteQuery = new ReactiveVar(false);
this.typeQuery = new ReactiveVar(false);
});
Template.jobs.helpers({
job: () => {
query = Template.instance().searchQuery.get();
remoteQuery = Template.instance().remoteQuery.get();
typeQuery = Template.instance().typeQuery.get();
let regex = new RegExp( query, 'i' );
// **************************
// the problem starts here
// **************************
if (Router.current().params.slug) {
const companyJobs = Company.findOne({slug: Router.current().params.slug}).jobs;
if ( companyJobs !== undefined) {
return Meteor.subscribe('Jobs', {'_id': { '$in': companyJobs }});
}
return false
} else if (Router.current().params.slug === undefined && remoteQuery === true ) {
return Job.find({ $or: [ { Name: regex }, { Description: regex }, ] , Remote: true, positionType: [],});
} else if (typeQuery = '') {
return Job.find({ $or: [ { Name: regex }, { Description: regex }, ] , positionType: typeQuery, });
},
// -------*****************************
employer: () => {
if (Router.current().params.slug === undefined) {
Meteor.subscribe('Companies');
return 'Poslodavac: ' + Company.findOne({_id: Template.currentData().CompanyId}).Name;
}
return false
},
jobUrl: () => {
Meteor.subscribe('Companies');
companySlug = Company.findOne({_id: Template.currentData().CompanyId}).slug;
return ('/company/' + companySlug + '/job/' );
}
});
Template.jobs.events({
'click .positionType': (event, templateInstance) => {
if (Template.instance().remoteQuery.get().lenght > 1){
Template.instance().typeQuery.set(Template.instance().remoteQuery.get().push(event.target.value));
console.log(Template.instance().remoteQuery.get())
} else {
console.log(Template.instance().remoteQuery.get())
console.log('ggggggg')
Template.instance().typeQuery.set(event.target.value);
}
},
'click #remoteFriendly': (event, templateInstance) => {
Template.instance().remoteQuery.set(!Template.instance().remoteQuery.get());
},
});
Html 带过滤器的模板:
<template name="jobs" >
<div>
<p>Filteri:</p>
<span>
<input type="checkbox" id="remoteFriendly" name="remote"> <span for="remoteFriendly"> Remote friendly? </span>
</span>
<span>
<p>Tip pozicije:</p>
<input type="checkbox" class="positionType" id="1" value="Programiranje" > <span for="1"> Programiranje </span>
<input type="checkbox" class="positionType" id="2" value="Dizajn" > <span for="2"> Dizajn </span>
<input type="checkbox" class="positionType" id="3" value="Marketing" > <span for="3"> Marketing </span>
<input type="checkbox" class="positionType" id="4" value="Ostalo" > <span for="4"> Ostalo </span>
</span>
</div>
{{#each job}}
<div style="border: 0.1rem solid black; margin: 1cm; padding: 5px; max-width: 420px;" > <!-- OVO JE PRIVREMENI STIL, OBRISATI-->
<p> Posao: {{Name}} <br> Opis: {{Description}}</p>
<p> {{employer}} </p>
<p>Remote friendly?: {{Remote}}</p>
<p>Tip pozicije: {{positionType}}</p>
<p> Saznajte vise <a href="{{jobUrl}}{{_id}}"> OVDE</a></p>
</div>
{{/each}}
<p id="nesto"></p>
</template>
欢迎来到 SO!
您似乎混淆了 Pub/Sub 和 Collection.find
。
您应该首先意识到这 2 个是不同的机制,它们提供不同的功能。
- Pub/Sub 确实将数据从您的服务器发送到您客户端的 Minimongo 数据库。但是这个数据还没有显示出来。
Collection.find
在您的服务器上用于您的实际 MongoDB,并在您的客户端上用于您的本地 Minimongo 数据库。
因此在您的客户端上,一旦您正确订阅了您的服务器发布(通常在应用程序级别或模板级别/在 onCreated
挂钩中),您可以直接在您的助手中调用 Jobs.find
(或其他任何地方)获取您的文档,而无需更改订阅(除非后者需要新参数)。
你注释的代码应该没有问题:
return Job.find({'_id': { '$in': companyJobs }});
一般来说,避免在助手中进行任何昂贵的计算(如 Meteor.subscribe
),因为助手可能会在您不注意的情况下执行多次。您的 Meteor.subscribe('Companies')
也应该进入模板级别(即在 onCreated
挂钩中)。
因此,与其在助手中执行 if / else
条件,不如在模板级别执行一次。考虑到您需要使用另一个集合中另一个文档的值,为什么不直接将公司的 slug 作为参数传递给您的 Jobs 订阅,并在服务器端执行计算?或者甚至只是订阅所有内容,就像您当前的初始订阅一样。
那么您的助手将只使用 Jobs.find
,它会查询您客户的本地 minimongo 数据库,而不会影响您的服务器。