2014-06-23 62 views
2

我有一個名爲Games的集合,我希望用戶使用複選框篩選集合。每次複選框被選中/取消,流星訂閱稱爲顯示相應Games過濾集合的更好模式

這裏是一個什麼樣的認購可能看起來像(不正確的蒙戈代碼)的例子:

{region: ['east','west','eu'], skill: ['casual','amatuer','pro'], gamemode: ['ctf','dm','etc']} 

在這個特殊的遊戲你可以過濾區域,技能和遊戲模式,每個有多個組合。

編輯:

我需要做的是建立適當的選擇,這取決於複選框被選中。

首先,我抓住選中的複選框 - 對於每個組 - 然後將它們引入數組,然後將該數組設置爲會話變量。

// Gamemode Group 
'click .mode input[type=checkbox]': function(ev, tpl) { 
    var mode = tpl.$('.mode input:checked').map(function() { 
     return $(this).val(); 
    }); 

    var modeArray = $.makeArray(mode); 
    Session.set('dotaMode', modeArray); 
    returnFilterQuery(); 
}, 

然後我檢查各組陣列,看看他們是否被填充,如果是,將其添加到最終的選擇(query),我將傳遞到訂閱。我的問題是我必須檢查每種可能的情況,除了if陳述之外,一旦我開始添加更多的組(搜索範圍,區域,技能等),將會有更多的組合。

function returnFilterQuery(){ 
    //check all fields and create a query object 
    var query = { game: 'dota' }; 
    var gamemode = Session.get('dotaMode'); 
    var region = Session.get('dotaRegion'); 
    var skill = Session.get('dotaSkill'); 

    // if no region or skill is selected, show user all 
    if (region.length && skill.length && gamemode.length) { 
     query.region = { $in: region }; 
     query.skill = { $in: skill }; 
     query.gamemode = { $in: gamemode }; 
    } else if (region.length && !skill.length && gamemode.length) { 
     query.region = { $in: region }; 
     query.gamemode = { $in: gamemode }; 
    } else if (!region.length && skill.length && gamemode.length) { 
     query.skill = { $in: skill }; 
     query.gamemode = { $in: gamemode }; 
    } else if (!region.length && !skill.length && gamemode.length) { 
     query.gamemode = { $in: gamemode }; 
    } else if (region.length && skill.length && !gamemode.length) { 
     query.region = { $in: region }; 
     query.skill = { $in: skill }; 
    } else if (region.length && !skill.length && !gamemode.length) { 
     query.region = { $in: region }; 
    } else if (!region.length && skill.length && !gamemode.length) { 
     query.skill = { $in: skill }; 
    } 

    return Session.set('dotaFilter', query); 
}; 

希望這一切都有道理。我確信必須有更好的方式,我現在只是無法想到什麼。謝謝。

+1

這感覺很像[這個問題](http://stackoverflow.com/questions/23937772/meteor-best-method-for-passing-mongo-selector-from-client-to-server)。我的答案是將選擇器傳遞給發佈函數 - 在這裏也可能適用。 –

+0

@DavidWeldon我的問題不一定是pub/sub,但更多的是關於生成正確的選擇器,具體取決於檢查哪個複選框。我將編輯我的原始文章,更詳細地解釋我想要做的事情。 – Nathan

回答

3

由於DotA參考,我感覺特別受到啓發來回答這個問題。 :)

因此,如果我正確理解問題,則不需要檢查每個組合,而是根據三個會話變量的內容反覆向query對象添加密鑰。我認爲以下內容在邏輯上等同於上面的returnFilterQuery函數。

var returnFilterQuery = function() { 
    var query = {game: 'dota'}; 

    var modifyQueryIfArray = function(key, sessionKey) { 
    var value = Session.get(sessionKey); 
    if (!_.isEmpty(value)) 
     query[key] = {$in: value}; 
    }; 

    modifyQueryIfArray('gamemode', 'dotaMode'); 
    modifyQueryIfArray('region', 'dotaRegion'); 
    modifyQueryIfArray('skill', 'dotaSkill'); 

    return Session.set('dotaFilter', query); 
}; 

注意isEmpty可以比length更安全的檢查的情況下,會話變量不是數組。

+0

非常感謝!效果很好,並且更容易添加額外的遊戲和過濾選項! – Nathan