Mongodb 加载模板后,如何将筛选结果应用于模板?

Mongodb 加载模板后,如何将筛选结果应用于模板?,mongodb,templates,meteor,datacontext,Mongodb,Templates,Meteor,Datacontext,下面是一个简单的例子: <template name="mealsList"> <div class="meals"> {{#each meals}} {{> mealItem}} {{/each}} </div> </template> Template.mealsList.helpers({ meals: function() { return Meals.find({}, { sort:

下面是一个简单的例子:

<template name="mealsList">
  <div class="meals">
    {{#each meals}}
      {{> mealItem}}
    {{/each}}
  </div>
</template>

Template.mealsList.helpers({
  meals: function() {
    return Meals.find({}, { sort: { eatenAt: -1 }});
  }
});

Template.mealsList.events({

  'click .run-filter': function(e) {
    var dateFrom = new Date(moment($('[name=dateFrom]').val()));
    var dateTo = new Date(moment($('[name=dateTo]').val()));

    builtTimeFrom = "01/01/2015 " + $('[name=timeFrom]').val();
    builtTimeTo = "01/01/2015 " + $('[name=timeTo]').val();
    var timeFrom = new Date(moment(builtTimeFrom));
    var timeTo = new Date(moment(builtTimeTo));

    Meteor.call('filterMeals', dateFrom, dateTo, timeFrom, timeTo, function(error, result) {
      if (error)
        return throwError(error.reason);

      console.log(result);
      // How can I apply result to the template?
    });
  }
});
使用a,您可以执行以下操作:

<template name="mealsList">
  <div class="meals">
    {{#each meals}}
      {{> mealItem}}
    {{/each}}
  </div>
</template>

Template.mealsList.onCreated(function() {
  this.meals = new ReactiveVar(Meals.find({}, { sort: { eatenAt: -1 }}));
});

Template.mealsList.helpers({
  meals: function() {
    return Template.instance().meals.get();
  }
});

Template.mealsList.events({

  'click .run-filter': function(e, temp) {
    var dateFrom = new Date(moment($('[name=dateFrom]').val()));
    var dateTo = new Date(moment($('[name=dateTo]').val()));

    builtTimeFrom = "01/01/2015 " + $('[name=timeFrom]').val();
    builtTimeTo = "01/01/2015 " + $('[name=timeTo]').val();
    var timeFrom = new Date(moment(builtTimeFrom));
    var timeTo = new Date(moment(builtTimeTo));

    Meteor.call('filterMeals', dateFrom, dateTo, timeFrom, timeTo, function(error, result) {
      if (error)
        return throwError(error.reason);

      temp.meals.set(result);
    });
  }
});

{{{每餐}
{{>mealItem}
{{/每个}}
Template.mealsList.onCreated(函数(){
this.fines=newreactivevar(finds.find({},{sort:{eatenAt:-1}));
});
Template.mealsList.helpers({
膳食:功能(){
返回Template.instance().founds.get();
}
});
Template.mealsList.events({
“单击。运行筛选器”:函数(e、temp){
var dateFrom=新日期(时刻($('[name=dateFrom]').val());
var dateTo=新日期(时刻($('[name=dateTo]')。val());
builtTimeFrom=“01/01/2015”+$('[name=timeFrom]')。val();
builtTimeTo=“01/01/2015”+$('[name=timeTo]')。val();
var timeFrom=新日期(时刻(builtTimeFrom));
var timeTo=新日期(时刻(builtTimeTo));
Meteor.call('filtermals',dateFrom,dateTo,timeFrom,timeTo,函数(错误,结果){
如果(错误)
返回投掷者(错误原因);
温度套餐(结果);
});
}
});

使用
会话变量有一种更简单的模式,但您也可以用反应变量代替:

Template.mealsList.helpers({
  meals: function() {
    var query = Session.get('myQuery');
    return Meals.find({},query,{ sort: { eatenAt: -1 }});
  }
});
这意味着模板帮助器是被动的,只要
myQuery
会话变量发生更改,模板帮助器就会自动更新结果!不要大惊小怪

您可以在事件处理程序中更新查询:

Template.mealsList.events({
  'click .run-filter': function(e) {
    var query = ...; // This needs to be a MongoDB query object pertinent to the collection being queried
    Session.set('myQuery',query)
  }
});
只有单击才能设置日期范围,但查询将在模板加载时运行,因此您还需要:

Template.mealsList.onCreated(function(){
  var query = Session.get('myQuery');
  if ( !query ){
    query = ... // initialize your query here
    Session.set('myQuery',query); // then stuff it into the session
  }
});
我不知道你为什么在那里有Meteor.call()
。您还必须从服务器获取文档吗

在这种情况下,您应该使用一个订阅来传递查询参数。例如,您可以通过以下方式扩展onCreated函数:

Template.mealsList.onCreated(function(){
  var query = Session.get('myQuery');
  if ( !query ){
    query = ... // initialize your query here
    Session.set('myQuery',query); // then stuff it into the session
  }
  var ti = this; // the template instance. We need this because we're about to nest
  ti.autorun(function(){
    ti.subscribe('Meals',query);
  });
});
Template.mealsList.onCreated(function(){
  var query = Session.get('myQuery');
  if ( !query ){
    query = ... // initialize your query here
    Session.set('myQuery',query); // then stuff it into the session
  }
  var ti = this; // the template instance. We need this because we're about to nest
  ti.autorun(function(){
    ti.subscribe('Meals',query);
  });
});