MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Uma maneira mais elegante de lidar com valores de filtragem no aplicativo Angular


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);
                }
        }
}