sql >> Base de Datos >  >> NoSQL >> MongoDB

Una forma más elegante de manejar los valores de filtrado en la aplicación Angular

Para que esto funcione, se trata de agregar más lógica condicional cuando se pasa un valor a través de { $in: value } . Dado que los errores que aparecían se debían a problemas de formato con { $in: value } , la clave era asegurarse de que esto se activa solo cuando hay un valor que pasar.

Entonces, al final, para que esto funcione, sin tener que pasar una matriz de todos los valores posibles, que no era una solución elegante ni eficaz, cambié esto:

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

... a esto:

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

Lo que esto hace es básicamente garantizar que una matriz de al menos un valor esté disponible cuando se activa { $in:value }.

El único otro cambio necesario fue el relacionado con lo que se emite cuando un usuario ha anulado la selección de todos los valores. Lo manejé de esta manera:

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