MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Un modo più elegante per gestire i valori di filtraggio nell'app angolare

Per farlo funzionare, è necessario aggiungere un po' di logica condizionale in più quando un valore viene passato tramite { $in: value } . Poiché gli errori che si stavano verificando erano dovuti a problemi di formattazione con { $in: value } , la chiave era assicurarsi che questo venisse attivato solo quando c'è un valore da passare.

Quindi, alla fine, per farlo funzionare - senza dover passare un array di tutti i valori possibili, che non era una soluzione elegante né performante - ho cambiato questo:

private processType(name: string, value: any, body)
{
    if (this.body[name] && !value) {
            delete this.body[name];
        } else {
            this.body[name] = { $in: value };
        }
}

... a questo:

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

Ciò che fa essenzialmente è garantire che un array di almeno un valore sia disponibile quando viene attivato { $in:value }.

L'unica altra modifica necessaria era quella che riguarda ciò che viene emesso quando un utente ha deselezionato tutti i valori. L'ho gestito in questo modo:

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