Aby to zadziałało, wystarczy dodać trochę więcej logiki warunkowej, gdy wartość jest przekazywana przez { $in: value }
. Ponieważ błędy, które się pojawiały, były spowodowane problemami z formatowaniem w { $in: value }
, kluczem było upewnienie się, że jest to wyzwalane tylko wtedy, gdy istnieje wartość do przekazania.
Tak więc, w końcu, aby to zadziałało - bez konieczności przekazywania tablicy wszystkich możliwych wartości, co nie było eleganckim ani wydajnym rozwiązaniem - zmieniłem to:
private processType(name: string, value: any, body)
{
if (this.body[name] && !value) {
delete this.body[name];
} else {
this.body[name] = { $in: value };
}
}
... do tego:
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 };
}
}
Zasadniczo zapewnia to, że tablica zawierająca co najmniej jedną wartość jest dostępna po wyzwoleniu { $in:wartość }.
Jedyną inną niezbędną zmianą była zmiana dotycząca tego, co jest emitowane, gdy użytkownik odznaczył wszystkie wartości. Załatwiłem to w ten sposób:
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);
}
}
}