Para fazer isso funcionar, é uma questão de adicionar um pouco mais de lógica condicional para quando um valor é passado via
{ $in: value }
. Como os erros que estavam aparecendo eram devido a problemas de formatação com { $in: value }
, a chave era garantir que isso fosse acionado apenas quando houver um valor a ser passado. Então, no final, para fazer isso funcionar - sem ter que passar em uma matriz de todos os valores possíveis, o que não era uma solução elegante nem de alto desempenho - alterei isso:
private processType(name: string, value: any, body)
{
if (this.body[name] && !value) {
delete this.body[name];
} else {
this.body[name] = { $in: value };
}
}
... para isso:
private processType(name: string, value: any, body)
{
if (this.body[name] && !value || this.body[name] && value.length < 1) {
delete this.body[name];
} else if (value) {
this.body[name] = { $in: value };
}
}
O que isso faz é basicamente garantir que uma matriz de pelo menos um valor esteja disponível quando o { $in:value } for acionado.
A única outra mudança necessária foi a que envolve o que é emitido quando um usuário desmarca todos os valores. Eu lidei com isso, desta forma:
private sendLangSelections(languageFilterOptions) {
const origLangArray = ['English', 'Spanish', 'Mandarin'];
if (languageFilterOptions)
{
let selectionsArray = this.languageFilterOptions.selection;
let values = selectionsArray.map((a) => { return a.value; });
if (values && values.length > 0)
{
this.sendLanguage.emit(values);
}
else if (values && values.length < 1)
{
this.sendLanguage.emit(this.obj = undefined);
}
}
}