2015-12-30 37 views
0

我有一个集合。默认情况下,整个集合显示在页面的表格中。然后,用户可以通过在1个或多个文本框中输入过滤器数据来缩小结果范围。动态创建一个查询查询,并让它触发帮手

所以我花了最后几个小时试图让这项工作做出反应,但失败了。助手低于:

Template.localBoardTemplate.helpers({ 

    localDelivery: function(){ 
     return localBoardColl.find(query); 
    } 
}); 

现在我对个人的文本框,所有触发相同功能的动态构建查询KEYUP事件:

function loadBoardRecords(){ 
    var query = {}; 

    if($('input:text[name=localBoardTripNumSetting]').val() != ""){ 
     query['tripNumber'] = {$regex: new RegExp('^' + $('input:text[name=localBoardTripNumSetting]').val(), 'i')}; 
    } 

    if($('input:text[name=localBoardLoadNumSetting]').val() != ""){ 
     query['orderLoadNum'] = {$regex: new RegExp('^' + $('input:text[name=localBoardLoadNumSetting]').val(), 'i')}; 
    } 

    if($('input:text[name=localBoardEquipmentSetting]').val() != ""){ 
     query['equipmentTypeName'] = {$regex: new RegExp('^' + $('input:text[name=localBoardEquipmentSetting]').val(), 'i')}; 
    } 

    if($('input:text[name=localBoardCustomerSetting]').val() != ""){ 
     query['Customer'] = {$regex: new RegExp('^' + $('input:text[name=localBoardCustomerSetting]').val(), 'i')}; 
    } 

    if($('input:text[name=localBoardTrailerNumSetting]').val() != ""){ 
     query['trailerNum'] = {$regex: new RegExp('^' + $('input:text[name=localBoardTrailerNumSetting]').val(), 'i')}; 
    } 


    if($('input:text[name=localBoardPUCitySetting]').val() != ""){ 
     query['puCity'] = {$regex: new RegExp('^' + $('input:text[name=localBoardPUCitySetting]').val(), 'i')}; 
    } 

    if($('input:text[name=localBoardPUStateSetting]').val() != ""){ 
     query['puState'] = {$regex: new RegExp('^' + $('input:text[name=localBoardPUStateSetting]').val(), 'i')}; 
    } 

    if($('#localBoardPUDateSetting').val() != ""){ 
     puDate = moment($('#localBoardPUDateSetting').val(), "MM-DD-YYYY").toDate(); 
     query['puDate'] = puDate; 
    } 

    if($('input:text[name=localBoardDELCitySetting]').val() != ""){ 
     query['delCity'] = {$regex: new RegExp('^' + $('input:text[name=localBoardDELCitySetting]').val(), 'i')}; 
    } 

    if($('input:text[name=localBoardDELStateSetting]').val() != ""){ 
     query['delState'] = {$regex: new RegExp('^' + $('input:text[name=localBoardDELStateSetting]').val(), 'i')}; 
    } 

    if($('#localBoardDELDateSetting').val() != ""){ 
     delDate = moment($('#localBoardDELDateSetting').val(), "MM-DD-YYYY").toDate(); 
     query['delDate'] = delDate; 
    } 
} 

现在,我一直在使用一个会话变量来保存尝试该查询失败,因为您不能在会话变量中嵌套对象。然后我尝试了一个名为ReactiveObj的包,并且我也无法工作。哎呀我甚至尝试了一个ReactiveArr,但是这不是被动的,除非你.list它并且不适用于find中的查询。

这不能是这个难题,我可能忽略了一些小事。我希望有人能指出我写这个问题的写封装或解决方案。

回答

0

我已经解决了这个问题,通过一些更多的试验和错误以及Thai Trans的答案。我用一个reativevar变量来存储一个对象。正确的代码如下:

助手:

Template.localBoardTemplate.helpers({ 
    localDelivery: function(){ 
     return localBoardColl.find(Template.instance().searchQuery.get()); 
    } 
}); 

创建于reacvtive-VAR的查询,并将其存储功能:

function loadBoardRecords(template){ 
    var query = {}; 

    if($('input:text[name=localBoardTripNumSetting]').val() != ""){ 
     query['tripNumber'] = {$regex: new RegExp('^' + $('input:text[name=localBoardTripNumSetting]').val(), 'i')}; 
    } 

      if($('input:text[name=localBoardPUStateSetting]').val() != ""){ 
     query['puState'] = {$regex: new RegExp('^' + $('input:text[name=localBoardPUStateSetting]').val(), 'i')}; 
    } 

    if($('#localBoardPUDateSetting').val() != ""){ 
     puDate = moment($('#localBoardPUDateSetting').val(), "MM-DD-YYYY").toDate(); 
     query['puDate'] = puDate; 
    } 

    if($('input:text[name=localBoardDELCitySetting]').val() != ""){ 
     query['delCity'] = {$regex: new RegExp('^' + $('input:text[name=localBoardDELCitySetting]').val(), 'i')}; 
    } 

    if($('input:text[name=localBoardDELStateSetting]').val() != ""){ 
     query['delState'] = {$regex: new RegExp('^' + $('input:text[name=localBoardDELStateSetting]').val(), 'i')}; 
    } 

    if($('#localBoardDELDateSetting').val() != ""){ 
     delDate = moment($('#localBoardDELDateSetting').val(), "MM-DD-YYYY").toDate(); 
     query['delDate'] = delDate; 
    } 


    template.searchQuery.set(query); 
} 

这完美的作品。即使在用户搜索期间,它也允许反应式收集更新。

0

快速正脏代码ReactiveVar

var buildQuery = function(formId) { 
    // put the code in the loadBoardRecords with the form id 
    // and return the query 

    return query; 
} 

Template.layout.helpers({ 
    localDelivery: function(){ 
     return Template.instance()['resultSet'].get(); 
    } 
}); 

Template.layout.events({ 
    'click .searchButton': function() { 
     var formId = $(...); // get the id for the form 
     var cursor = localBoardColl.find(search(formId)); 

     Template.instance()['resultSet'].set(cursor); 
    } 
}); 

Template.layout.created = function() { 
    this['resultSet'] = new ReactiecVar(null); 
} 
+0

这样做是否仍然会在收集新项目时自动更新dom?从我的理解你在这里做的只是轮询集合,每当按钮被按下并保存到反应变量光标。如果另一个用户将某些内容添加到集合中会发生什么它会作出相应的反应? – BobFranz

+0

光标是reative –

0

其实你可以存储在会话变量嵌套对象。

在助手:

Template.localBoardTemplate.helpers({ 

    localDelivery: function(){ 
     var query = Session.get('QUERY') || {}; 
     return localBoardColl.find(query); 
    } 

}); 

上的事件:

function loadBoardRecords(){ 
    var query = Session.get('QUERY') || {}; 

    if($('input:text[name=localBoardTripNumSetting]').val() != ""){ 
     query['tripNumber'] = {$regex: new RegExp('^' + $('input:text[name=localBoardTripNumSetting]').val(), 'i')}; 
    } 

    . 
    . 
    . 
    . 
    . 

    if($('#localBoardDELDateSetting').val() != ""){ 
     delDate = moment($('#localBoardDELDateSetting').val(), "MM-DD-YYYY").toDate(); 
     query['delDate'] = delDate; 
    } 

    Session.set('QUERY',query); 
} 

这是完全可能的。

+0

我试过这个。是我想到如何做到这一点。当我在控制台登录会话变量时,它将拥有所有适当的键,但不会有正则表达式搜索字符串,这使得我相信你不能嵌套对象。为了解决这个问题,我的控制台一个接一个地热爱查询和会议,看看有什么不同。 – BobFranz